我有一个班级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;
};
当我调试时,构造的第一次迭代工作正常。已创建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
。
答案 0 :(得分:4)
您很可能没有正确实施copy constructor
和operator =
,而是双重删除solution
。如上所述,您还应该阅读The Rule of Three。
C ++标准容器store copies,当您执行push_back
时,您正在制作副本。
答案 1 :(得分:0)
看起来你没有在Foo类中实现复制构造函数。在Bar构造函数中,每次迭代都会在迭代结束时创建并销毁新的Foo实例。因此,在Foo中分配的内存被销毁,但是将Foo实例复制到vector的默认复制构造函数没有复制您使用“new”分配的内存,只是复制了指针。因此,在每次迭代后,每个向量元素都被破坏。假设向量在开始时为您的对象分配了一些内存。然后当缓冲区中没有位置并且他不能再增长缓冲区时,vector会分配新内存并发生另一个复制操作。当复制操作完成时,需要释放旧缓冲区并且向量销毁旧缓冲区中的所有对象,并且每个对象中的析构函数将在损坏的指针上调用delete []。