malloc和new开的数组为什么可以free和delete掉?

如题,为什么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,或者内部还有指针),那么是无法完成释放的。

posted @ 2020-03-11 01:31  NeoZy  阅读(506)  评论(0)    收藏  举报