16

指定された型の配列を内部的に管理するテンプレート クラスを作成しています。このような:

template<typename T>
class Example {
    // ...
private:
    T* objects; // allocated in c'tor (array), deleted in d'tor
    // ...
};

objectsを介してオブジェクトを削除するときに、C++が各オブジェクトのデストラクタを呼び出すかどうか疑問に思っていましたdelete[] objects;

私のクラスのオブジェクトには常に適切な値が含まれているわけではないため、これを知る必要があります。そうでない場合はデストラクタを呼び出すべきではありません。

T objects[100]さらに、の一部として固定サイズの配列を宣言した場合、デストラクタが呼び出されるかどうかを知りたいですExample<T>

4

6 に答える 6

30

にデストラクタがある場合T、 によって呼び出されdelete[]ます。セクション5.3.5から、c++11 標準 (ドラフト n3337) の削除、6 節:

delete-expression のオペランドの値が NULL ポインター値でない場合、delete-expression は、削除されるオブジェクトまたは配列の要素のデストラクタ (存在する場合) を呼び出します。配列の場合、要素はアドレスの降順に破棄されます (つまり、コンストラクターの完了の逆順です。12.6.2 を参照してください)。

型のデストラクタは、配列が動的に割り当てられず、配列がスコープ外になる (有効期間が終了する) 場合にもT、配列内の各要素に対して呼び出されます。T[]


私のクラスのオブジェクトには常に適切な値が含まれているわけではないため、これを知る必要があります。そうでない場合はデストラクタを呼び出すべきではありません。

しかし、破壊できない状態を獲得できるオブジェクトには、非常に重大な問題があるようです。

于 2013-06-27T13:43:52.093 に答える
3

はい、を使用すると、配列内のすべてのオブジェクトに対してデストラクタが呼び出されますdelete[]。しかし、コンストラクターは、配列内のすべてのオブジェクトを使用new[]して割り当てたときに呼び出されたため (そうでしたか?)、それは問題ではありません。

構築されたオブジェクトが、デストラクタの呼び出しが無効になるような状態になる可能性がある場合は、オブジェクトに深刻な問題があります。すべての場合でデストラクタを機能させる必要があります。

于 2013-06-27T13:43:40.253 に答える
2

答えはイエスです。各オブジェクトのデストラクタが呼び出されます。

delete関連する注意事項として、可能な限り使用を避けるようにしてください。代わりに、スマート ポインター ( 、unique_ptrなどshared_ptr) と STL コンテナー (std::vector、std::array など) を使用してください。

于 2013-06-27T13:43:54.083 に答える
2

delete[] objects以下に似ています(ただし同一ではありません)。

for (i = 0; i < num_of_objects; ++i) {
    delete objects[i];
}

デストラクタを呼び出すので、同じdeleteことを期待できますdelete[]

于 2013-06-27T13:43:35.107 に答える
1

delete []配列の各要素に対してデストラクタを呼び出します。メンバー配列 ( your ) についても同じことが起こりますT objects[100]

それをポインターとして保持し、テンプレートが指す「意味のない」値を処理するように、デストラクタ (およびコピー コンストラクタ、およびコピー代入演算子、3/5 の規則をobjects参照) を設計します。

于 2013-06-27T13:43:43.107 に答える