2017-05-25 14 views
-4

のフィールドを使用することは、私を混乱させるコードの抜粋です:は、ポインタを削除し、ここで削除されたオブジェクト

T* pop(){ 
if(head == 0) 
     return 0; 
T* result = head->data; 
Link* oldHead = head; 
head = head->next; 
delete oldHead; 
return result; 
} 

resultポインタは頭のオブジェクトの「データ・フィールド」を指すように集約しています。その後、headが削除されます。 resultはと一緒に削除されているので、nullまたは空白を指す必要がありますか?

+0

混乱を避けるために、['std :: stack <>'](http://en.cppreference.com/w/cpp/container/stack)を使用してください。 –

+0

リンクデストラクタはデータをクリーンアップしますか?そうでなければ、いいえ。 – Eddge

+0

リンク先?頭は何ですか?私はあなたの例をコンパイルできません... –

答えて

3

dataフィールドはheadと一緒に削除されますので、NULLまたは空白スペースを指すように持っていないresultていますか?あなたは

delete oldHead; 

を実行するとoldHeadためのメモリが割り当て解除され

。ただし、デストラクタのdelete dataLinkでない限り、dataは引き続き有効なポインタです。したがって、resultを返して、呼び出し元関数の戻り値を引き続き使用することは大丈夫です。

あなたは

Link::~Link() {} 

を持っている場合は問題はありません。

あなたは

Link::~Link() { delete data; } 

を持っている場合は、問題があります。

+3

を投稿したのではなく、答えを推測することに同意します。なぜOPが[mcve]を投稿するのを待つのですか? –

+0

今、この "答え"は正しいとマークされています...将来の読者はどのような "if"が当てはまるかを知っていますか? –

+1

@Ðаn、将来の読者は、使用しているデストラクタに基づいてコードに問題があるかどうかを知ることができます。私はその答えから明らかでない理由を理解していません。 –

関連する問題