【问题标题】:Double free or corruption caused by vector [closed]向量造成的双重免费或损坏[关闭]
【发布时间】:2016-06-11 23:37:41
【问题描述】:

我的一个类(称为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:我不知道我可以在这里提供一个简短的代码示例。它发生在我的代码中的几个地方,所有地方都发生了很多事情,我不太清楚哪些部分是相关的。评论表明这是内存损坏问题,因此我可以查找。

【问题讨论】:

  • 程序在析构函数中崩溃并不意味着这就是错误所在。欢迎使用 C++。您需要发布minimal reproducible example
  • vector 的析构函数不会导致问题,而是代码中的其他内容。很遗憾,您没有提供太多信息。
  • 通常内存问题直到稍后才会出现。如果你设法破坏了一些你可能不知道的东西,直到你尝试释放内存。

标签: c++ memory


【解决方案1】:

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

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

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

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

【讨论】:

  • 那么这是否意味着存储向量的字段一定会被意外覆盖?
  • 可能就是这个意思。这可能意味着别的东西。写入无效地址的结果是未定义的,这意味着对于结果发生的情况没有明确的限制。
  • 谢谢彼得,您的评论告诉了我需要知道什么才能找到错误。事实证明,我实际上是在覆盖存储向量的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多