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


      一个可能的原因:在不同模块(工程)之间传递 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,看看设置是否一样,如果不一样要改成一样的。

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

  • 相关阅读:
    一个开始搞Linux的现任前端开发,用U盘装CentOS
    .NET:处理数据库事务中的并发
    Xml与对象之间的序列化、反序列化
    嵌套类
    .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
    backbone 之事件(events)
    一道笔试指针题目详解
    linux安装Cassandra数据库
    Angularjs Controller 间通信机制
    NLucene 和 Lucene .NET
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/16669053.html
Copyright © 2020-2023  润新知