“Invalid Address specified to RtlValidateHeap”错误? 解决方案 【汇总】

时间:2022-10-24 07:36:07

[VC] 如何解决“Invalid Address specified to RtlValidateHeap”错误?

2008年09月17日 星期三 21:41

一个可能的原因:在不同模块(工程)之间传递 C++ 类,而这两个模块用了不同的运行时库(Runtime Library)设置。例如:EXE 模块调用 DLL 模块里传递 C++ 类的函数,但 DLL 模块使用静态链接(Release 是 Multi-threaded (/MT)、Debug 是 Multi-threaded Debug (/MTd))方式编译,而 EXE 模块使用动态链接(Release 是 Multi-threaded DLL (/MD)、Debug 是 Multi-threaded Debug DLL (/MDd))方式编译。

可以对比这两个模块的工程属性 - C/C++ - Code Generation - Runtime Library,看看设置是否一样,如果不一样要改成一样的。

如果无法解决问题,那就是别的原因了。

 

 

Invalid Address specified to RtlValidateHeap

  调试一个程序,在非break point的地方,弹出窗口,说是出现错误,看底部 out put窗口说是Invalid Address specified to RtlValidateHeap,初步认为是指针释放的错误,又走了一边程序,并没有重复释放的嫌疑,于是就边debug 边观察IDE中的call stack 发现问题出现在析构函数中的自定义的release方法,由于习惯,在定义类的时候常定义一个release方法,用于在类析构的时候检查动态分配的内存是否都已经正确的释放,这里出来问题说明还是指针的问题,仔细检查,发现自己定义了一个LPTSTR指针,起初对其进行了内存的分配,在程序中对字符串进行操作的过程中对其进行了++,于是最后该指针指向了‘\0’,则再进行释放就出现了问题,最好是将分配好的内存指针赋值给成员变量,然后操作采用临时变量,最后释放成员变量。在此记一下这个错误,忘以后谨记