std :: vector导致堆崩溃

时间:2014-07-17 13:15:25

标签: c++ visual-studio-2012

我有一个奇怪的heisenbug,它出现在VC11 C ++下的x86 Release模式中。不幸的是,我无法想出一个仍然存在错误的最小示例,但是这里有一个正常工作:

#include "stdafx.h" // <- nothing special in here
#include <vector>

class MyClass {
    std::vector<double> myVec;
public:
    void init(int m) {
        myVec = std::vector<double>(m); // (3)
    }
};

int _tmain(int argc, _TCHAR* argv[]) {
    MyClass x; // (1)
    x.init(1); // (2)
}

现在在(1)中我创建了一个MyClass的实例,其中myVec应默认构造为空向量。在(2)中我调用init来改变myVec的值,参见(3)。在那里我得到了一些错误。

在重新分配myVec的原始内容期间,错误始终是堆错误。似乎myVec不包含任何内存,但无论如何它都试图释放它。但是,错误仅在发布模式下出现,并非总是如此(尽管事实上算法总是在相同的数据上运行并且没有随机元素,因此在80%的情况下都会出现错误),并且它在步进程序时不会出现调试器(实际上足以在此行中有一个断点并始终按F5继续)。

我可以使用

解决问题
    myVec.resize(0);
    myVec.resize(m);

而不是(3)。但我现在担心的是,我的程序中仍然存在一个导致未定义行为的错误,因此myVec没有正确构造(或者至少在某种程度上进入了正常状态)。我不知道这样的bug会是什么样子以及从哪里开始寻找它。

之前是否有人遇到过类似的问题,并想知道如何系统地找到错误原因?我知道在这种情况下很难进行远程诊断,但任何帮助都会受到赞赏。

更新

我安装了Application Verifier,在此期间发现了如何使用Visual Studio中的WinDbg - 真的很酷,有一个可以与之交谈的调试器:-)。不幸的是,它只告诉我,我尝试在当前没有分配内存的地方释放内存,并且发生这种情况的地址会随着运行而变化。但我无法找出发生这种情况的原因。

然后我开始仔细检查我的代码,顺便说一下,重新设计了这个项目。当我完成后,错误不再出现了。我没有改变算法只重新组织了一下。我让同事查看我改变的部分,他也看不到错误,无论是重构版本还是原始版本。

然后我将源代码回滚到重构之前的版本,错误也消失了。我真的很困惑!我只检查了我的来源,没有二进制文件和目标文件。现在,我最好的两个假设是:
- 要么错误仍然只是随机而没有symtoms
- 或者在构建期间出现了问题,可能涉及外部库的某些问题,由于某种原因不再发生。

我现在将继续处理我的项目,并希望错误再次出现,我可以找到原因,或者它将永远保持沉默。

0 个答案:

没有答案