c++ new和delete在release模式和debug模式下的区别

根据侯捷老师在vc6上实验的结果:仅供参考

debug模式下,在heap堆中拿到的空间,在其上有 :

1.分配空间大小

2.是否被new或delete

3.debug header用于调试

4. 下方有4字节的无用区域

5.无用区域后可能有pad(保证这个空间大小是16字节的倍数)

6.在pad后有和1、2相对应的信息

 

release模式下,在heap堆中拿到的空间,在其上有

1.分配空间大小

2.是否被new或delete

3.在其下方有pad

4.pad下方有和1、2相对应的信息

 

虽然这么说,但是我访问了(vs2019在)release模式下的前一个内容,发现我都不出来想要的数字,不知道是怎么回事

4个内存分布图:第1个是debug模式的new Complex;第2个为release模式,少了很多信息;第3、4为new String

0x000041 体现了空间大小是0x40, 还有1个1表示这个是被new了,还没有被delete。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int* p = new int(3);
    cout << "p address:" << p << endl;
    cout << "before p: " << --p << endl;
    cout << "this number is :" << *p << endl;
    p++;
    delete p;
}

4个内存分布图:第1个是debug模式的new Complex[3] ;第2个为release模式,少了很多信息;第3、4为new String[3]

可以看出,相较于new Complex,不管是release还是debug,都会有空间保存申请量,以便delete[]使用。

可以猜测的是:如果p指向了第一个字节,那p-4就是那个数值。

我要尝试一下:结果发现在vs2019和linux下不行,--p的值读不到。也就是说3这个值我读不到。不知道怎么回事。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int* p = new int[3];
    p[0] = 11;
    p[1] = 12;
    p[2] = 13;
    cout << "p address:" << p << endl;
    cout << "before p: " << --p << endl;
    cout << "this number is :" << *p << endl;
    p++;
    cout << "p[1] address : " << &(p[1]) << endl;
    cout << "p[2] address : " << &(p[2]) << endl;
    delete[] p;
}

delete时的问题:

不过似乎还有一个疑问:

使用了new String[3]  和delete p; 这个p前面也有3,为什么他不用这个3呢?而delete[]就会这么做,它有了3还不用,这不是傻子么。  难道说 new [] 和delete 搭配也是可以的,但是大多数情况都不符合真实情况?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值