假设我有一个名为" Object" (非常原创,我知道)。要在堆上初始化,我会这样做:
Object object* = new Object ("arg");
要在堆栈上分配:
Object object= Object("arg");
当我使用前者时,我的程序崩溃,并指出我在" new.cpp"中的这行代码。
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
_THROW_NCEE(_XSTD bad_alloc, ); <---- this line
}
return (p);
}
知道了,我将如何找到错误并修复错误?我认为这是某种堆内存的损坏?
答案 0 :(得分:0)
根据我的经验,这通常发生在您通过使用指针写入对象/缓冲区/数组的末尾,或删除无效指针,或双删除指针或任何其他指针来执行某些操作而损坏堆时破坏堆管理器使用的基础数据结构的活动。你正在观察一个后期的崩溃,这只是以前发生的事情的症状。
根据您的平台,您可以通过链接CRT调试堆来检查Visual Studio,或者使用Electric Fence,Valgrind等在Linux上进行检查。
Visual Studio堆调试 - http://msdn.microsoft.com/en-us/library/z8h19c37(v=vs.100).aspx
Valgrind - http://valgrind.org/info/tools.html
Electric Fence和Valgrind通常是Linux上的可选包。