3

それぞれがポインターの配列を持つ構造体のベクトルを作成しようとしています。ただし、メモリの問題がなければベクターを削除できないようです。

valgrind を実行すると

==29801== 無効な free() / delete / delete[] / realloc() ==29801== at 0x4A05A36: operator delete (vg_replace_malloc.c:515) ==29801== by 0x4009D4: test_struct::~test_struct( ) (/home/hltcoe/rcotterell/code-switching/a.out 内) ==29801== by 0x40142B: void std::_Destroy(test_struct*) (/home/hltcoe/rcotterell/code-switching/a.out 内) out) ==29801== by 0x401299: void std::_Destroy_aux::__destroy(test_struct*, test_struct*) (/home/hltcoe/rcotterell/code-switching/a.out 内)

編集

#include <vector>
using namespace std;

struct test_struct {
  public:
    int * array;
    test_struct() {
       array = NULL;
    }
    ~test_struct() {
       delete[] array;
    } 
   private:
     test_struct(const test_struct& that);
     test_struct& operator=(const test_struct& that);
};

int main(int argc, char ** argv) {

  vector <test_struct> data;

  for (int i = 0; i < 5; ++i) {
       test_struct tmp;
       tmp.array = new int[5];
       data.push_back(tmp);
   }
}

そして、次のコンパイルエラーが発生します。何か案は?

4

2 に答える 2

2

test_structデストラクタと、構造体を に格納しようとしているという事実のために、ソリューションは機能しませんvector。をベクターにプッシュすると、 のコピー
が作成されます。その後、呼び出しで破棄され、コピーはダングリングポインターになります。 おそらくアーキテクチャを再考するか、少なくとも配列全体をコピーするためのコピーコンストラクタを追加する必要がありますtest_struct tmptest_structtmpdelete[] arrayvector <test_struct> data
test_struct

于 2013-06-04T07:14:27.730 に答える