2012-03-25 10 views
1
struct node 
{ 
    node(int _value, node* _next) : value(_value), next(_next) {} 

    int value; 
    node* next; 
}; 

node *p = new node(10, NULL); 
delete p; 

のノード用のメモリブロックの割り当てを解除DELETE`、operator deleteは、まず、nodeのデストラクタを呼び出し、もともとpに割り当てられた生のメモリブロックの割り当てを解除します。どのように `演算子は、私の理解に基づいて、LinkedListの

struct nodeにはカスタマイズされたデストラクタが用意されていないため、コンパイラはデフォルトのデストラクタを提供します。

質問1>デフォルトのデストラクタはどのように見えますか?例えば 、

node::~node() 
{ 
    next = NULL; 
} 

Question2>我々はstruct nodeかないのデストラクタを定義する必要がありますか? 私はそのようなデストラクタを明示的に提供する必要はないと仮定します。その理由は、メンバ変数nextは、指し示されたリソースを所有しておらず、weak_ptrとして振る舞います。あれは正しいですか?

答えて

3

私には正しい音です。

struct nodeは "Plain Old Datatype"なので、実際にはデストラクタコードはまったく作成されません。intやポインタを特別に破壊する必要はありません。

はさえ非POD型のため、コンパイラのデフォルトのデストラクタは単に形をとるだろう。

~node() { } 

個々のメンバーは、まだ彼らのデストラクタが呼び出されますが、任意の非自動リソースを割り当てなかった場合、一般にデストラクタを用意する必要はありません。あなたがいるかもしれない状況がありますが、それはやや特殊な目的です。

3ルールでthis questionを参照してください。

関連する問題