0

いくつかのオブジェクトのヒープに 2D 配列を作成しました。

ステップ1)

Obj **arr = new Obj *[n];

for (int i=0;i<n;i++)
{
    arr[i] = new Obj[n];
}

// したがって、これは 2D arr[n][n] を作成します...それを削除すると:

ステップ2)

for (int i=0;i<n;i++)
{
    delete [] arr[i];
}
delete [] arr;

したがって、この削除が何をするのかまだわかりません。Obj のデストラクタを実行し、OS にフラグを立てて、これが現在使用可能なメモリであることを伝えますか。

今、私が本当に理解していないのは、ステップ(1)を(削除した後)再度実行すると、これらのオブジェクトが奇妙な値に初期化されますが、これは最初に実行したときは発生しません(すべてゼロで初期化されます) . 初めて運が良かっただけですか?

4

2 に答える 2

0

あなたの例には Obj の宣言がありません。

  • new[] はメモリを割り当て、各要素のコンストラクタを呼び出します
  • コンストラクターがメモリを変更しない場合、いくつかのランダムな値 (おそらくゼロ) が表示されます。
  • delete[] は、以前に new[] で割り当てられた各要素のデストラクタを呼び出し、最後にメモリの割り当てを解除します。
  • デバッグ コンパイルでは、割り当て解除を示すいくつかのバイトでメモリがいっぱいになることがあります。
  • 解放の直後に new[] を実行すると、インジケータ バイトが表示される場合があります。
于 2013-11-14T23:32:32.753 に答える
0

私の知る限り、削除と新規作成を何回繰り返しても、次のコードでは奇妙な値は得られません。

#include <iostream>
using namespace std;

class Foo
{
public:
    Foo(): val(-2) { cout << "ctor" << endl; }
    ~Foo() { cout << "dtor: " << val << endl; }

private:
    int val;
};

int main()
{
    Foo **arr = new Foo *[2];
    for (int i = 0; i < 2; ++i)
        arr[i] = new Foo[2]();    // <- for builtin type, () is required to initialized to zero.

    for (int i = 0; i < 2; ++i)
        delete [] arr[i];
    delete [] arr;
    return 0;
}

関連する投稿:演算子 new はメモリをゼロに初期化します

ポインターを削除した後にポインターがどうなるかについては、次の投稿を参照してください: C - 配列が解放されると、ポインターの配列はどうなりますか?

于 2013-11-14T23:40:21.360 に答える