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 
#include 

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;
}

c++ new和delete在release模式和debug模式下的区别_第1张图片

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 
#include 

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;
}

c++ new和delete在release模式和debug模式下的区别_第2张图片

delete时的问题:c++ new和delete在release模式和debug模式下的区别_第3张图片

不过似乎还有一个疑问:

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

你可能感兴趣的:(c++)