0

クラス があり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ます。

2 番目の反復も問題なく動作しているように見えますが、3 番目の反復を開始するために戻ったときにプログラムがクラッシュします。

_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 constructorand をoperator =適切に実装しておらず、 を二重に削除していsolutionます。前述のように、The Rule of Threeも読む必要があります。

C++ 標準コンテナはコピーを格納push_backするため、コピーを作成することになります。

于 2013-03-13T17:26:46.377 に答える
0

Fooクラスにコピーコンストラクタを実装しなかったようです。Barコンストラクターでは、反復ごとにFooの新しいインスタンスが作成され、反復が終了すると破棄されます。したがって、Fooに割り当てられたメモリは破棄されますが、Fooのインスタンスをベクターにコピーしたデフォルトのコピーコンストラクタは、「new」で割り当てたメモリをコピーせず、ポインタをコピーしただけです。したがって、各反復後に、各ベクトル要素が破損します。ベクトルには、最初にオブジェクトに割り当てられたメモリがあると仮定します。次に、バッファに場所がなく、そのバッファを拡張できなくなった場合、vectorは新しいメモリを割り当て、別のコピー操作が発生します。コピー操作が終了したら、古いバッファを解放する必要があり、vectorは古いバッファ内のすべてのオブジェクトを破棄し、各オブジェクトのデストラクタは破損したポインタに対してdelete[]を呼び出します。

于 2013-03-13T18:01:44.377 に答える