内存泄漏,矢量回推c ++

时间:2013-03-13 17:24:24

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

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

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;
};

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

第二次交互似乎也可以正常工作,但程序在返回开始第三次迭代时会崩溃。

我收到_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误和HEAP CORRUPTION DETECTED

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

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

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

2 个答案:

答案 0 :(得分:4)

您很可能没有正确实施copy constructoroperator =,而是双重删除solution。如上所述,您还应该阅读The Rule of Three

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

答案 1 :(得分:0)

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