内存泄漏,c++的向量回推

Memory leak, vector pushback c++

本文关键字:向量 c++ 泄漏 内存      更新时间:2023-10-16

我有一个类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->nBlockUse)错误和HEAP CORRUPTION DETECTED .

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

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

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

很可能您没有正确实现copy constructoroperator =,并且您正在双重删除solution。如前所述,你还应该阅读"三的规则"。

c++标准容器存储副本,所以当你执行push_back时,你是在复制。

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