【发布时间】:2011-02-22 10:09:39
【问题描述】:
在 Visual C++ 中,使用new[] 分配对象数组,然后默认使用delete(不是delete[])triggers undefined behavior of the following kind。
为所有对象调用析构函数需要知道对象的数量,因此 Visual C++ 调用::operator new[]() 来分配稍大的缓冲区,将元素数量放在开头,然后调用构造函数并返回指向第一个对象的指针。当delete 完成后,它只会破坏第一个对象,然后将错误的指针传递给::operator delete(),这恰好与::operator delete[]() 默认的实现方式完全相同。
如果出现以下情况
class Class {
public:
~Class() { Sleep( 0 );}
};
delete new Class[1];
在 Release 配置中编译并在调试器下运行,程序在断点处停止:
ntdll.dll!_DbgBreakPoint@0()
ntdll.dll!_RtlpBreakPointHeap@4() + 0x28 bytes
ntdll.dll!_RtlpValidateHeapEntry@12() + 0x113 bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0x97 bytes
ntdll.dll!_RtlFreeHeapSlowly@12() + 0x246cf bytes
ntdll.dll!_RtlFreeHeap@12() + 0x17646 bytes
sample.exe!free(void * pBlock=0x0003339c) Line 110 C
sample.exe!main() Line 48 C++
sample.exe!__tmainCRTStartup() Line 266 + 0x12 bytes C
kernel32.dll!_BaseProcessStart@4() + 0x23 bytes
这看起来像堆损坏 - 至少这是我在这种情况下所期望的。
我试图在该行之前和之后调用_heapchk(),令人惊讶的是它两次都返回_HEAPOK。我也是enabled memory leak detection,程序结束时没有报告泄漏。
如果_heapchk() 返回_HEAPOK,我可以假设堆是完整的吗?
【问题讨论】:
标签: c++ visual-c++ memory-management undefined-behavior