1. ホーム
  2. c++

[解決済み] C++ ポインターの配列:delete または delete []?

2022-02-11 22:11:37

質問

次のコードを考えてみてください。

class Foo
{
    Monster* monsters[6];

    Foo()
    {
        for (int i = 0; i < 6; i++)
        {
            monsters[i] = new Monster();
        }
    }

    virtual ~Foo();
}

正しいデストラクタは何ですか?

これを

Foo::~Foo()
{
    delete [] monsters;
}

またはこれです。

Foo::~Foo()
{
    for (int i = 0; i < 6; i++)
    {
        delete monsters[i];
    }
}

現在、一番上のコンストラクタで、すべて問題なく動作していますが、もちろん、たまたま漏れているのかどうかはわかりません...。

個人的には、私がやっていることを考えると、2番目のバージョンの方がずっと論理的だと思います。とにかく、これを行うための "適切な"方法は何でしょうか?

どのように解決するのですか?

delete[] monsters;

は正しくありません。 monsters は、動的に確保された配列へのポインタではありません。 ポインタの配列です。クラスのメンバーとして、クラスのインスタンスが破棄されるときに自動的に破棄されます。

配列内のポインタは、動的に割り当てられた Monster オブジェクトを作成します。

現在のメモリ割り当て戦略では、おそらく独自のコピーコンストラクタとコピー代入演算子を宣言して、意図しないコピーによって二重削除が発生しないようにしたいことに注意してください。(もしコピーを防ぎたいのであれば、これらをプライベートとして宣言し、実際には実装しないことも可能です)。