【问题标题】:Memory leak, vector pushback c++内存泄漏,向量 push_back c++
【发布时间】:2013-03-01 19:07:53
【问题描述】:

我有一个类Bar,它的构造函数初始化一个Foo 类型的std::vector(另一个类)。

Bar.cpp

Bar::Bar(int n) {
 for(int i = 0; i < n; i++) {
    Foo foo;
    foo.somefunction(i);
    vec.push_back(foo) //this should insert foo into the vector
  }
}

Bar.h

class Foo;
class Bar {
 std::vector<Foo> vec;
};

当我调试时,构造的第一次迭代工作正常。 foo 已创建,foo.somefunction() 运行正常,foo 被推入 vec

第二次迭代似乎也可以正常工作,但是当它返回开始第三次迭代时程序崩溃了。

我收到_BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse) 错误和HEAP CORRUPTION DETECTED

Foo 是一个包含动态创建数组的类,没什么特别的。 像这样的:

Foo::Foo() {
  solution = new float[size];
  // some function that initializes the elements of solution
}

和一个常规的析构函数~Foo() {delete [] solution;}。我认为问题不是来自Foo

【问题讨论】:

  • 三法则可能。
  • 您使用了Foos 的向量。你为什么不也使用floats 的向量呢?我打赌你的问题会神奇地消失。
  • 我尝试用这种方式声明一个浮点向量:std::vector vec (size);但它不起作用。有什么方法可以声明一个在运行时确定的大小的向量?
  • @jazzybazz:向量本质上是动态的。你不必给他们一个大小。但是如果你想给一个初始大小,使用构造函数初始化器来做。例如,Foo::Foo() : solution(size) { ... }.

标签: c++ memory vector memory-leaks heap-memory


【解决方案1】:

很可能您没有正确实现copy constructoroperator =,并且您正在双重删除solution。如前所述,您还应该阅读The Rule of Three

C++ 标准容器store copies,因此当您执行push_back 时,您正在制作副本。

【讨论】:

  • 谢谢,我想我会摆脱动态数组,改用float的向量。
  • @jazzybazz 这可能是最简单的解决方案
【解决方案2】:

看起来你没有在 Foo 类中实现复制构造函数。在 Bar 构造函数中,每次迭代 Foo 的新实例都会在迭代结束时创建和销毁。所以在 Foo 中分配的内存被破坏了,但是将 Foo 的实例复制到 vector 的默认复制构造函数并没有复制你用“new”分配的内存,只是复制了指针。因此,在每次迭代之后,每个向量元素都会被破坏。假设向量在开始时为您的对象分配了一些内存。然后,当缓冲区中没有位置并且他无法再增加该缓冲区时,vector 分配新内存并发生另一个复制操作。复制操作完成后,需要释放旧缓冲区,vector 销毁旧缓冲区中的所有对象,每个对象中的析构函数将对损坏的指针调用 delete[]。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2016-01-21
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多