0

動的メモリについて何かを理解したい: 以下のクラス テンプレートの新規および削除。

以下のようにクラステンプレートを定義するいくつかのライブラリ(社内で開発された)によって定義されたクラステンプレートがあります。

template <class DAT, class IDX, int ENTRYMX=0x20, int SUBMX=34, int bsz=8> 
class HashTable : public public HashTableIn
{
HashTable () 
: HashTableIn(ENTRYMX),
  ...


...
...
}

私のコードでは、そのテンプレート クラスのオブジェクトを次のように使用します。

mpRt = new HashTable<data_st,index_st>;

そして、このmpRtを明示的に削除します(スマートポインターは知っていますが、現在、このレガシーコードでは使用されていないため、除外します)

delete mpRt;

私の質問:私はしなければならないかどうかを理解しようとしています

delete [] mpRt

because the class template has a default argument of ENTRYMX = 0x20
4

4 に答える 4

2

私はしなければならないかどうかを理解しようとしていますdelete [] mpRt

いいえ、コールするまでに割り当てます。ペアでコールmpRtする必要があります。operator newdelete mpRt;new/deletenew [] /delete[]

ENTRYMXinsideを使用HashTableしてメモリを動的に割り当てる場合は、 insidenew[]を呼び出して割り当てを解除する必要があります。また、3 つのルールに従うことも忘れないでください。delete[]HashTable

于 2013-08-21T10:08:39.970 に答える
2

標準から:

5.3.4 新しい [expr.new]

8/ 割り当てられた型が非配列型の場合、割り当て関数の名前はoperator newであり、割り当て解除関数の名前はoperator deleteです。割り当てられた型が配列型の場合、割り当て関数の名前はoperator new[]であり、割り当て解除関数の名前はoperator delete[]です。

new常に付属していdeleteます。

new []常に付属していdelete []ます。

あなたの場合、mpRtは で割り当てられ、 で割り当てをoperator new解除する必要がありますdelete

于 2013-08-21T10:14:48.650 に答える
1

なぜですか?mpRtで割り当てられた配列ではありませんnew[]

配列を含む場合がありますが (引数 name のヒントとしてENTRYMX)、mpRtそれ自体は配列型ではありません。この配列に関連するメモリの管理はクラスの内部で行われ、このクラスのオブジェクトを作成するコードの責任ではありません。

経験則: news とdeletes およびnew type[]s とs を一致させdelete []ます。

于 2013-08-21T10:09:17.530 に答える
1

いいえ、常に new/delete と new[]/delete[] をペアで使用してください。new[] を明示的に使用していない場合は、delete[] を使用しないでください。

于 2013-08-21T10:14:11.760 に答える