-2

したがって、「ポインタの配列」を示す次のコードがあります(私は思います)

main() {
  int *array[3];
  int x = 10, y = 20, z = 30;

  array[0] = &x;
  array[1] = &y;
  array[2] = &z;

  return 0;
}

ここで、sの代わりに、int作成したオブジェクトクラスの一種であるとしましょう。

したがって、この配列からメンバーを削除したいと思います(つまり、deleteキーワードを使用してそのデストラクタを呼び出し、オブジェクトを破棄しますが、ポインタは正常なままです)。

私の疑いが正しければ、それは不可能であり、私が持っている唯一の選択肢は、配列の内容を新しい配列(削除したいものを除く)にコピーしてから、前の配列を削除することです(全体として、そのすべての要素を含む)新しいものをポインターに割り当てますarray

特に「ポインタの配列」という名前は非常に誤解を招くため、誰かが私の疑惑を確認または修正していただければ幸いです。ありがとうございました。

4

2 に答える 2

2

あなたがクラスを持っていると仮定してFoo

Foo a;

これはFooオブジェクトのインスタンスですスタックに割り当てられます。それらがスコープから外れると、すぐに破壊されます。

オブジェクトを明示的に破棄できるようにする場合は、オブジェクトをヒープに割り当てます。

Foo* a = new Foo(); // Allocated - Constructor called.
delete a; // Freed - Destructor called.

覚えておくべき良いルールは、すべてnewに一致するものがなければならないというdeleteことです。それ以上でもそれ以下でもありません。あなたの例では、newキーワードを使用していないので、キーワードの場所はありませんdelete

Foo* array[3];

スタック上のFooオブジェクトポインタの配列です。それらは何も指していません。初期化されていません。この配列は、スコープ外になると破棄されます。ポインタであるコンテンツのみを破棄し、それらが指すものを解放しようとしないことに注意してください。

array[0] = new Foo();

配列はFoo、ヒープ上のオブジェクトへのポインタを保持するようになりました。また、初期化されていない2つのポインタが含まれています。arrayスコープから外すと、メモリリークが発生します。これを防ぐには、Fooオブジェクトを解放する必要があります。

delete array[0];
array[0] = NULL;

初期化されていない、または削除されたポインタをNULLに設定することもお勧めします。このようにして、それが何も指していないことを明示的に確認できます。これで、次のようなチェックを実行できます。

if(array[0])
{
    // We know there is an object here, since it's not NULL.
    delete array[0];
    array[0] = NULL; // Helps prevent trying to free memory more than once.
}
于 2012-10-24T04:38:59.230 に答える
0

私があなたの問題を理解している限り、それは2つの理由で機能しません:

  1. このような要素(intまたはA)はヒープではなくスタックに存在するため、削除することはできません。スコープ外の場合は自動的に削除されます。
  2. 配列を削除または移動しても、前述のようにその要素は削除されません。

「array[1]の内容の消去」については、次の方法で実行できます。

array[1] = NULL;

私があなたを正しく理解していれば。

于 2012-10-24T03:08:50.490 に答える