0

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

条形图.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
  }
}

酒吧.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.

4

2 回答 2

4

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

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

于 2013-03-13T17:26:46.377 回答
0

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

于 2013-03-13T18:01:44.377 回答