2016-10-17 7 views
2

こんにちは私が持っているsome_structは次のように定義されstd :: map <struct, int>デストラクタが必要ですか? cppのクラスXで

class X{ 
    private: 
     std::map<some_struct, int> C; 
} 

typedef struct{ 
    int a; 
    int b; 
    int c; 
}some_struct; 

私の質問です:私はXのデストラクタ内のマップCについては何も指定する必要がありますか? "はい"の場合、XのデストラクタはマップCに対してどのような操作を行うべきですか?

+0

remove関数を作りますか、すべての要素を通過し、マップから消去/削除し、クラスXのデストラクタでその関数を呼び出します。 –

+3

@OmidCompSCIしないでください。 'std :: map'のデストラクタはより効率的にそれを行います –

+4

あなたはちょうどゼロのルールに従うべきです:http://en.cppreference.com/w/cpp/language/rule_of_three https://rmf.io/cxx11/0の規則/ –

答えて

5

いいえ、あなたはそれが自動的にコンパイラによって生成されるすべてのタイプについてsome_structまたはclass X

のデストラクタを指定する必要はありません。 newまたはnew []の動的ストレージに明示的に割り当てられたものがない限り、deleteまたはdelete[]操作を適用するデストラクタを記述する必要はありません。

struct some_struct { 
    int a; 
    int b; 
    int c; 
}; 
+1

デストラクタはすべての型に対して生成されます – NathanOliver

+1

すべてのクラスには自動的にデストラクタが生成されます –

+0

"明示的にクラスに割り当てられたものはありませんでした..."参照されるクラスはXです。some_struct sone_structのデストラクタで解放する必要があるメモリを割り当てます。 – Carl

2

限り、あなたはnew演算子を導入しないように、あなたがにもいいです:


はまた、(C VS)のC++コードを書くためにあなたがtypedef構文ことを使用する必要はありません。デフォルトのデストラクタを使う。

ALL STLのコンテナ(マップ、ベクトル、リスト、dequeなど)には特別なデストラクタは必要ありません。彼らは自己完結型であり、一度あなたが範囲外になると、自分自身を破壊するようにきれいに設計されています。

+0

'new'演算子は、デストラクタが必要かどうかを示す良い指標ではありません。私は 'unique_ptr (new some_struct)'を持つことができます。まだ –

+0

@BryanChenを保存します。 "デフォルトのデストラクタには新しいものがない場合は"というステートメントを保持します。それは逆を意味するものではありません:新規の場合は、デフォルトのdestrcutorよりも多くのものが必要です。カウンタの例では – user463035818

+0

@BryanChenを示していますが、それはバグです。スマートポインタコンストラクタがスローすると、メモリがリークしてしまいます。これはメイク機能を使用する理由の1つです – NathanOliver

0

あなたが動的例えばnewオペレータ、とヒープ上のオブジェクトを割り当てられていた場合は、デストラクタでは約Cを心配する必要があります:

class X{ 
    public: 
     X(); 
    private: 
     std::map<some_struct, int> *p_C; 
} 

と定義:

X::X() { 
    p_C = new map<some_struct, int>(); 
} 

X::~X() { 
    if(p_C) delete p_C; 
} 
+1

あなたはスマートポインタを使用しているのでそうしないからです。 – BeyelerStudios

+0

C++の_heap_は何ですか?基準? –

+1

@πάνταῥεῖ誰が今ニックピッキングしているのですか:P –

関連する問題