0

クラスオブジェクトへのポインタのベクトルがあります。これらのクラスオブジェクトも「new」を呼び出して配列を作成します。

メモリリークを回避しようとしているので、オブジェクトの配列をフリーストアに戻すデストラクタを作成しました。

laboratory::~laboratory()
{
   delete Users;   // Users is an array from the heap
}

ただし、ポインタベクトルの各要素を削除しようとすると、プログラムがクラッシュします。

for(int i = 0; i < vectorSize; i++)
    delete labVector[i];

どんな助けでも大歓迎です。

編集:ここに貼り付けられたコード:http://pastie.org/4168453

クラスと関数の定義はmain()の下にあります。このように貼り付けて申し訳ありませんが、ヘッダーファイルと2つのソースファイルを使用していました。

4

6 に答える 6

4
delete Users;   // Users is an array from the heap

それでは、それは間違っています。する必要があります

delete [] Users;

あなたが持っているものnewはすべて、で[]取得delete[]ます。

ちなみに; ここにポインタのベクトルが本当に必要ですか実際にそれが必要になることは非常にまれであり(よく見られますが)、メモリを管理するコンテナの機能が完全に無効になり、すべての要素をループして割り当てを解除する必要があります。

ベクターは、各要素の舞台裏でダイナミックメモリを使用します。スマートポインタのベクトルまたはvector<vector<T>>(ただし、パフォーマンスが最大の懸念事項である場合は、ジャグ配列の方が適している場合があります。ただし、それを想定しないでください)。

于 2012-06-28T23:35:27.720 に答える
3

どうしても自分でこれを行う必要ptr_vectorがない限り、代わりにBoostの使用を検討してください。

于 2012-06-28T23:38:45.280 に答える
3

いくつかの選択肢があります:

  1. ベクトルがその中のオブジェクトを所有しておらず、それらへのポインターのみを所有していることを明確にすることができます。その後、このベクトルを使用してオブジェクト自体を割り当ておよび削除するすべてのコードの責任になります。

  2. これにはブーストptr_vectorを使用できます。ベクターは、ポインターを含むオブジェクトを所有します。オブジェクトを複製して機能させるには、ヘルパー関数を作成する必要がありますx = y;。(x内のすべてのオブジェクトの独自のコピーを所有する必要があるためyです。)

  3. これには、 などのスマート ポインターを使用できますboost::shared_ptr。するとx = y;、2 つのベクトルは同じオブジェクトを参照するため、一方の値を変更すると他方の値も変更されます。ベクターはオブジェクトの所有権を共有し、それらのオブジェクトへの安全な参照を返すことができます。オブジェクトは不要になると自己破壊します。

  4. オブジェクトのベクトルを使用できboost::anyます。これはパフォーマンスが悪いですが、非常に柔軟です。

しかし、それは本当に古典的な質問に帰着します:あなたは何をしようとしていますか? オブジェクトの寿命を管理しようとしていますか? ベクターを複製するとどうなるでしょうか? それは基になるオブジェクトを複製する必要がありますか? ポリモーフィズムが必要ですか?スライスを避けるためにポインターを使用していますか? 等々。ユースケースを説明すると、より良いソリューションの提案が得られます。

更新: ポインターのベクトルの使用は単純で安全に思えます (ベクトルのコピー構築、代入などを試みない限り)。ループがクラッシュしてdeleteいるということは、おそらくデストラクタにバグがあることを示唆しています。

Update2 : はい。

laboratory::~laboratory()
{
    delete stationUsers;
}

stationUsersで割り当てられたのではなく、 で割り当てられたため、これは間違ってnewnew[]ます。

于 2012-06-28T23:43:36.197 に答える
1

これ以上のコードがないとわかりませんが、次のことを考慮してください。

delete[] Users;
于 2012-06-28T23:32:21.167 に答える
0

自分でヒープから配列を割り当てないでください。を使用しstd::vector<User>ます。さらに、決して自分自身を使用してはいけdeleteませんdelete[]。スマートポインタなどのクラスベースのソリューションを常に使用するかstd::vector、メモリを管理してください。

于 2012-06-28T23:37:37.267 に答える
0

他のコメントに加えて、コードに Off-by-One エラーがあります。このコードは、配列の末尾を 1 つ過ぎたところを参照します。

for(int i = 0; i `<` vectorSize; i++)
    delete labVector[i];
于 2012-06-28T23:43:13.010 に答える