双向免费或由矢量引起的腐败

时间:2016-06-11 23:37:42

标签: c++ memory

我的一个类(称为Distribution)的析构函数抛出double free or corruption错误。当我进行回溯时,我得到了这个:

#7  0x0000000000409212 in std::vector<double, std::allocator<double> >::~vector (
this=0x7fffffff8f70)
at /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_vector.h:351
#8  0x00000000004032c5 in Distribution::~Distribution (this=0x7fffffff8f28)
at Distribution.cpp:165

因此,当Distribution析构函数完成并尝试在向量上调用析构函数时,会发生错误。它只是一个包含双精度的简单向量,而不是指针或任何东西。 ~vector怎么可能导致此错误?

ETA:我不知道我可以在这里提供一个简短的代码示例。它发生在我的代码中的几个地方都有很多事情发生,我不太清楚哪些部分是相关的。评论表明这是一个内存损坏问题所以我可以寻找它。

1 个答案:

答案 0 :(得分:3)

如果没有代表性的MCVE,几乎不可能给出具体答案。

一般而言,最可能的解释是,某些其他代码(可能在构造函数和析构函数之间调用对象,但它可能在您的对象构造之前)调用了未定义的行为,例如通过骚扰指针。

效果可能非常间接。发生错误操作时,无法保证立即发生崩溃。事实上,在没有可见症状的情况下发生故障是很常见的,导致不相关代码中行为的细微变化,并且最终这些微妙变化中的一个导致操作系统可以检测到的更大的故障 - 然后它终止您的程序

在你的情况下,一些这样的级联事件可能会影响你的矢量分配器的工作。这会导致向量的析构函数崩溃,尽管原因在于完全不相关的代码。