0

チュートリアル、検索、および私の C++ の正式な教育のぼんやりした記憶のせいで、ループ内で動的に割り当てられたオブジェクト ポインターを使用しているときに、どこで delete を使用する必要があるかがわかりません。たとえば、次のようになります。

// necessary files are included, this code is within main
T * t;
t = foo.getNewT();
while (!t->isFinalT()) {

    // print t stuff

    delete t;         // is this where I should delete t?
    t = foo.getNewT();
}

delete t;

この知識の欠如は、最近のクラスのプロジェクトで特に厄介になりました。私のラップトップ (Linux Mint、g++ Ubuntu/Linaro 4.7.3-1ubuntu1) では、コードは delete ステートメントなしで正常に実行され、delete ステートメントを追加するとクラッシュしました。学校のサーバー (Solaris、g++ (GCC) 3.4.5) では、delete ステートメントを使用せずに数回繰り返した後にコードがセグメンテーション違反になり、delete ステートメントを追加すると正常に実行されます。

この種のループを適切に処理して、ほとんどの環境で実行するにはどうすればよいですか?

追加情報: プログラムが削除要求に達すると、ラップトップでエラーが発生します。

*** Error in 'program': free(): invalid next size (fast):...

他のコードの一部:

// T.h
class T {
    int id;
    int num;
    int strVarPos;
    char * strVar;
  public:
    T();
    ~T();
    // + misc. methods
}

// T.cpp
T::T() {
    id = 0;
    num = -1;
    strVarPos = 0;
    char * strVar = new char[11];
    strVar[0] = '\0'
}

T::~T() {
    delete [] strVar;
}

// Foo.cpp
T * Foo::getNewT() {
    T * t = new T;

    // populate T's fields

    return t;
}

解像度:

just と loop を使用した簡単なテストT * tは正常に機能したため、プロジェクトを空白から再構築し、一度に 1 つのクラスを追加して、いつ問題が発生するかを確認しました。配列の初期化に使用していたサイズ定数を更新せずに、プログラムの他の場所で動的に割り当てられた配列に追加のコンテンツを追加したことがわかりました。

明らかに、学校のサーバーは、ポインターを適切に削除することを確認した場合にのみ、結果として生じるメモリの不一致をクラッシュせずに処理できました (プログラムは、私のテストで重大なメモリ リークを引き起こすほど長く実行されませんでした)。 delete を呼び出そうとするまでのメモリの不一致 (その後クラッシュする)。

4

4 に答える 4

1

問題は ではありませんdelete。あなたはそれを正しい場所に置きました。未定義の動作を引き起こしているのは、あなたがしている他の何かである可能性が高くなります。

delete t ループの後にも必要であることに注意してください(最後のループをキャッチするため)。foo.getNewT()これは、 が常に有効なポインターを返すことを前提としています (NULL であるかどうかを確認しないため、ポインターが必要です)。

于 2013-10-30T21:44:10.403 に答える
1

動的に割り当てられたメモリは、不要になったら削除する必要があります。tループ内で値を保持したい場合はfor、ループ外で削除するか、ループ内で削除します。

ただし、最善の方法は、std::unique_ptr本当に pointers を使用する必要がある場合に使用することです。メモリへのすべての参照が破棄されると、メモリ自体の割り当てが解除されます。できるだけメモリを割り当てないようにする必要があります。ジョブに適合する場合は、STL コンテナーを使用します。

于 2013-10-30T21:45:20.427 に答える
0

delete t構造内の実際のオブジェクトを削除しているときだと思います。

多分それが問題の原因です。

于 2013-10-30T21:49:00.833 に答える