- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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];
在发布配置中编译并在调试器下运行程序以断点停止:
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
,我可以假设堆是完整的吗?
最佳答案
来自 the documentation (强调我的):
The
_heapchk
function helps debug heap-related problems by checking for minimal consistency of the heap.
它不会检查绝对的一致性和正确性:它应该能够检测到重大的、令人震惊的错误,但它不会捕获所有错误。
关于c++ - 如果 _heapchk() 返回 "okay",我可以假设堆没有损坏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076749/
在 Visual C++ 中,使用 new[] 分配一个对象数组,然后 delete(不是 delete[])默认为 triggers undefined behavior of the follow
我是一名优秀的程序员,十分优秀!