首页 > 编程语言 > 详细

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

时间:2020-03-11 10:02:47      阅读:65      评论:0      收藏:0      [点我收藏+]

如题,为什么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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!