C++内存泄漏及内存对齐

内存架构

在这里插入图片描述

什么是内存泄漏?

简单说就是申请了一块内存地址,使用完毕之后没有释放,造成了内存泄漏。

具体体现为:

  1. newmalloc申请资源使用后,没有用deletefree释放。
  2. 子类继承父类时,父类的析构函数不是虚函数。
  3. windows句柄资源使用后没有释放。

如何检测内存泄漏?

  1. 使用了内存分配的函数,使用完之后记得释放。
  2. 将分配内存的指针以链表的形式保存管理,使用完毕后从链表中删除,程序结束时检查改链表。
  3. 使用智能指针。
  4. 使用其他工具:linuxccmalloc

为什么要内存对齐

需要字节对齐的根本原因在于CPU访问数据的效率问题

内存对齐的具体体现

内存对齐用于三种数据类型中:class/struct/union

  1. 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始。

  2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)。

  3. 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的"最宽基本类型成员"的整数倍。不足的要补齐。(基本类型不包括struct/class/uinon)。

  4. sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。


版权声明:本文为weixin_45847364原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。