6

関数の使用例: cpp で delete を見ましたが、完全には理解できませんでした。コードは次のとおりです。

class Name {
    const char* s;
    //...
};

class Table {
      Name* p;
      size_t sz;
public:
      Table(size_t s = 15){p = new Name[sz = s]; }
      ~Table { delete[] p; }
};

コマンドの正確なアクションは何ですか: delete[] p;?

目的は、コンテナ テーブル内のすべてのポインタを削除することだったと思います。

角かっこは、delete[]Name へのポインターの配列を削除する手がかりを与えてくれますが、配列のサイズは指定されていません。では、デストラクタは削除するポインターの数をどのように「知る」のでしょうか?

4

2 に答える 2

14

delete関数ではなく、演算子です。

を使用するdelete式は、[]で作成されたオブジェクトを破棄しnew ... []、関連するメモリを解放します。delete[]によって返されるポインターに使用する必要がありますnew ... []。non-arraydeleteによって返されたポインタでのみ non-array new。一致しないdeleteフォームを使用することは常に正しくありません。

(コードにない)のdelete式は、動的に作成されたオブジェクトの配列を破棄し、配列の各メンバーに対してデストラクタが呼び出されるようにします。~Table()()NameName

割り当てられた配列内の要素の数を記録する何らかのメカニズムを実装するのは実装次第ですnew ... []。プログラマーはこれについて心配する必要はありません。

配列要素に重要なデストラクタがある多くの実装では、new[]式はすべての配列メンバーのスペースの前に要素数を記録するために余分なスペースを割り当てます。この非表示のカウントはdelete[]、正しい数のデストラクタが呼び出されるようにするために使用されるときに検索されます。これは単なる実装の詳細ですが、他の実装も可能です。

于 2010-08-07T12:43:55.123 に答える
1

つまり、delete[]削除する必要があるため、削除する配列のサイズを知っています。

C++ 言語標準では、それを認識しなければならないと述べているためです。delete[]したがって、配列を割り当てるとき、サイズを見つけられる場所に格納するのはシステム次第です。

1 つのオプションは、必要以上に数バイトを割り当てることです。最初のバイトを使用してサイズを指定し、最初に割り当てられたバイトへのポインターを返す代わりに、サイズ フィールドを過ぎた最初のバイトへのポインターを返します。

次にdelete[]、サイズを見つけるために、ポインターから数バイトを差し引く必要があります。

もう 1 つのオプションはmap<void*, int>、キーがメモリ割り当てへのポインターであり、値がその割り当てのサイズである global を持つことです。delete[]サイズを知る方法は他にもたくさんあります。C++ 標準では、どちらを使用するかは指定されていません。サイズを知る必要があるとだけ言っており、それを実現する方法delete[]を理解するのは実装者に任せています。

于 2010-08-07T12:48:49.260 に答える