如题,为什么free和delete(当然底层还是调用free)能够释放数组空间。
写个测试代码:
#include <iostream> #define N 16 using namespace std; int main() { int* p = (int*) (malloc(sizeof(int) * N)); for (int i = 0; i < N; ++i) { p[i] = i; } free(p); return 0; }
运行,并且定位一下p的内存位置:
嗯,数组前面的fdfdfdfd是什么?再前面还有几个数字,不确定,再试试。
N改成32:
N改成64:
N改成128:
好了,最前面那个01可能是指示这是新开的内存或者指示堆内存之类的,和开数组大小无关,排除。最后面的9a也是,和数组大小无关。
剩下中间的这个数字:
40---N=16
80---N=32
0001---N=64
0002---N=128
那4应该就是指4个int。4*4=16
8指8个int,8*4=32
0x10(十进制的16)指16*4=64
0x20(十进制的32)指32*4=128
至于这些数值为什么是反过来的呢,我还没有搞懂。正常X86都是小端机器,十进制1->十六进制00 00 00 01。按字节逆序反过来就是01 00 00 00,从上面的图里也可以证明。但前面的例子实际是直接按位逆序,而不是按字节逆序。有了解的朋友可以评论告诉我一下。
另外一个知识点:用new开的堆空间可以用free释放,但不会调用相应的析构函数。所以,如果是内置类型,free完成和delete一样的效果(包括int,double,数组等)。如果是自建类型(包括stl,或者内部还有指针),那么是无法完成释放的。
malloc和new开的数组为什么可以free和delete掉?
原文:https://www.cnblogs.com/FdWzy/p/12460048.html