我一直在努力解决堆损坏问题。 vs 2005调试器首先警告我,在删除我先前创建的对象之后,我可能破坏了堆。对这个问题进行研究导致我发现了gflags和页面堆设置。在为我的特定图像启用此设置后,它可以使我指向实际上导致损坏的那一行。

Gflags将相关对象的构造函数识别为罪魁祸首。该对象派生如下:

class POPUPS_EXPORT MLUNumber :  public MLUBase
  {
...
  }
class POPUPS_EXPORT MLUBase : public BusinessLogicUnit
  {
...
  }

我可以在一个单独的线程中实例化一个MLUNumber,并且不会发生堆损坏。

我可以实例化另一个类,该类也从MLUBase继承,不会导致堆损坏。

访问冲突的产生是由于在构造函数的右括号处发生了损坏,这似乎是由于对象(?)的隐式初始化所致。

基类构造函数(MLUBase)成功完成。

从vs 2005的内存窗口中挖掘,似乎没有为实际对象分配足够的空间。我的猜测是仅为基类分配了足够的资源。

导致故障的线路:
BusinessLogicUnit* biz = new MLUNumber();

我希望是可能导致此问题的原因,或者是希望执行其他故障排除步骤。

最佳答案

不幸的是,根据所提供的信息,不可能确切地诊断问题。

您可能需要检查的一些事项:

  • 确保BusinessLogicUnit具有虚拟析构函数。通过基本指针对对象进行delete编码时,必须在基类中存在虚拟析构函数,才能正确地分解子类。
  • 确保使用相同的预处理器标志和编译器选项构建所有源文件。标志中的差异(可能在调试/释放标志之间?)可能会导致结构大小更改,从而导致在不同源文件中报告的大小之间不一致。
  • 即使使用gflags设置,某些类型的堆损坏也有可能未被发现。审核您的其他堆用于尝试查找问题的根源。理想情况下,您应该将一个最小的测试用例放在一起,它将可靠地崩溃,但是 Activity 量最少,因此可以缩小原因。
  • 尝试一个干净的解决方案并重新构建;我偶尔会看到时间戳被弄乱了,而且旧的目标文件可以使用过时的结构定义进入。至少值得检查:)
  • 关于c++ - 新对象导致堆损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6472968/

    10-13 06:43