预设值 | 说明 |
---|---|
0xCC |
栈上申请的,未初始化的变量,的缺省值 |
0xCD |
堆上申请的,未初始化的变量,的缺省值 |
0xDD |
堆上申请的,所在空间释放后,的缺省值 |
0xFD |
在已申请的堆区空间上,设定上下边界值 |
而以上三者的输出结果就是 烫烫烫屯屯屯葺葺葺。
使用 visual studio 演示:
1、栈空间未初始化空间缺省值为 0cCC
,堆空间未初始化空间缺省值为 0cCD
2、边界栅栏值 0xFD
。
tips: 这也是为什么单个堆对象不能用
delete []
释放的原因
https://docs.microsoft.com/zh-cn/cpp/cpp/new-and-delete-operators?view=msvc-170void operator delete( void * ); void operator delete( void *, size_t );
如下图:对象如果存在显示的析构函数,则在堆区会预留4字节空间保存对象个数,以便delete[]时知道要调用多少次析构函数。而单个对象不存在这片预留空间,调用delete[]时,误把上届0xfdfdfd当做对象个数,从而多次析构函数。
3、堆区内存释放后,预设值 0xDD
可以注意到,delete之后,pa指针指向了一个新的地址。为了防止空悬指针被在此使用,我们应在delete之后将其置空。
delete示范内存规则:https://docs.microsoft.com/zh-cn/cpp/cpp/delete-operator-cpp?view=msvc-170
- delete对对象使用 运算符可释放其内存。 在删除对象后进行解引用指针操作的程序可能会产生不可预知的结果或崩溃。
- delete当 用于解除分配 C++ 类对象的内存时,如果对象具有析构函数,则先调用该对象的析)构函数, 再释放该对象的内存。
- 如果运算符的操作 delete 数值是可修改的左值,则删除 对象后,其值将不确定。
Memory Management and the Debug Heap | Microsoft Docs
该块的用户数据区域两侧的NoMansLand缓冲区当前大小为4字节,并由一个已知字节值填充,调试堆例程使用该字节值来验证用户内存块的限制没有被覆盖。调试堆还用一个已知的值填充新的内存块。如果您选择将释放的块保存在堆的链表中,如下所述,这些释放的块也会被一个已知的值填充。目前,实际使用的字节值如下所示
.
NoMansLand (0xFD)
The “NoMansLand” buffers on either side of the memory used by an application are currently filled with 0xFD.Freed blocks (0xDD)
The freed blocks kept unused in the debug heap’s linked list when the _CRTDBG_DELAY_FREE_MEM_DF flag is set are currently filled with 0xDD.New objects (0xCD)
New objects are filled with 0xCD when they are allocated.