2007年6月3日星期日

又一个内存分配的问题

错误内容如下:
Debug Assertion Failed!

Program: ... \*.exe
File:dbgheap.c
Line: 1044
Expression: _CrtIsValidHeapPointer(pUserData)

For information how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
在调试的时候,点击 Retry,程序找到文件 ...\VC98\CRT\SRC\DBGHEAP.C
停在了
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));

也就是刚才报错的那个程序,但是有注释提醒了一些处理。

已知的错误可能:
内存非配的错误。
程序中使用了两个类,都有动态创建的内容。
其中在一个类A中动态创建了另一个类B的对象,然后又动态创建了这个类B的对象的几个动态数组c。
在这个错误出现之前,曾经想用B.setDim(aNumber)来为c分配内存,但是在Debug Mode下有如下的错误。
Unhandled Exception in GasMain.exe: 0xC0000005: Access Violation.
内存分配失败。
但是,如果直接使用 B.c=new double[aNumber];却没有错误。
但是出现了本文最初提到的错误。
解决方法(其实是错误原因找到了):
在Workspace里面的External Dependencies下面有一个b.h头文件,这个文件应该与 B类的头文件一样,而且因为已经有了 B.h,应该没有必要在这个地方出现这个同样的头文件,可能是我添加文件时出错了。而且这两个头文件是不一样的。

更正这个错误后,上面的错误就消失了。

没有评论: