【侯捷P8】定义类时分配的内存

定义类时分配的内存


complex 类的调试模式下

包含两个double 4字节

new 一个complex对先分配内存,在内存中的分布如下:

【侯捷P8】定义类时分配的内存

解释一下:

首先,两个double会得到8个byte,也就是绿色部分(这里比较迷惑,一个double不应该是占据8个byte的吗?任意类型的指针是占据4个byte的,不知道这里是不是当做指针了)。

然后,在调试模式下会得到灰色部分的内存(32+4)

第三,上下各两个红色的“小饼干”代表是类

这个时候加起来就是52个byte了,但是应该是16的倍数,距离52最近的16的倍数(比52大的)为64,所以最后加上3个pad,凑成64.

complex类的非调试模式下

【侯捷P8】定义类时分配的内存

string类的调试模式下

【侯捷P8】定义类时分配的内存

string类的非调试模式下

【侯捷P8】定义类时分配的内存

complex类数组分配内存

【侯捷P8】定义类时分配的内存

解释一下:

3个复数:8*3(灰色)

调试模式:32+4(黄色)

上下两个小熊饼干:4*2(两头的白色)

存放元素的个数:4(白色)

pad凑80:4*2(蓝色)

string类数组的分配内存

【侯捷P8】定义类时分配的内存

array new一定要搭配array delete

【侯捷P8】定义类时分配的内存

忘记使用array delete 会造成内存泄漏,但是不是我们想的那样在string类分配的内存空间内部泄漏,而是图上这种形式,因为string类内部的成员是指针,如果不用delete[] p,那么会导致除第一个之外的char* 指向的内存不会清空.如果是complex类的话,不调用delete[] p是没关系的,因为内部成员都存放在了系统为这个类分配的内存上。

为了养成一个好习惯,只要array new 就要array delete!

系统为这个类分配的内存上。

为了养成一个好习惯,只要array new 就要array delete!