根据侯捷老师在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 搭配也是可以的,但是大多数情况都不符合真实情况?