2011-12-26 8 views
4

私はC++がポインタを引数として渡す方法についていくつかの研究を行ってきましたが、これまで私の質問に対する確かな「はい/いいえ」の答えを見つけることができませんでした。C++は引数として渡されたポインタのクリーンアップをどのように処理しますか?

私はその上でdelete/freeを呼び出す必要がありますか、それとも自分自身のものをクリアするにはC++スマートですか?

私は決して渡されたポインタの削除を呼び出すことはなかったので、あなたはそうする必要はないと思いますが、実際に必要な状況を誰かが知っているかどうか知りたいと思います。

ありがとうございます!

答えて

9

引数として渡されるポインタに使用される記憶域がクリーンアップされます。しかし、彼らが指摘している記憶は浄化されません。

ので、例えば:

void foo(int *p) // p is a copy here 
{ 
    return; 
    // The memory used to hold p is cleared up, 
    // but not the memory used to hold *p 
} 

int main() 
{ 
    int *p = new int; 
    foo(p); // A copy of p is passed to the function (but not a copy of *p) 
} 

あなたは、多くの場合、人々は「スタック上」と「ヒープ上」の話を聞くことができます。 *ローカル変数(例えば引数)はスタックに格納され、自動的にクリーンアップされます。 new(またはmalloc)を使用して割り当てられたデータは、自動的にはクリーンアップされないヒープに格納されます。


*ただし、C++標準では「スタック」と「ヒープ」については言及していません(実際は実装固有の詳細です)。用語「自動ストレージ」と「割り当てられたストレージ」をそれぞれ使用します。

+0

これは私が思ったものです。迅速な対応に感謝します。 –

+2

振り返ってみると、私の質問はかなり愚かであることが分かります。関数が終了するとポインタはスタック上でクリアされますが、実際のデータはヒープ上に残ります。再度、感謝します! –

+0

@PhilElm:これは、リソース管理クラスのためのものです。 C++には 'malloc/free'スタイルのメモリ管理がありません。 – Puppy

4

メソッドに渡される引数はスタックに格納されるため、関数がローカル変数と同じように自動的に破棄されます。ポイント先のメモリは自動的に解放されません。

2

呼び出し元からポインタを受け取った場合は、呼び出し元のはそのポインタを解放する必要があります(別途記載がない限り)。

1

ポインタがコピーされます。「値で」受け入れられます。関数が存在するとき、それらは破壊されますが、それらのデストラクタは自明であるため、それらが示すメモリには何も行われません。

1

ポインタ自体については、 int型やchar型と同じように、関数の戻り時にパラメータスタックフレームが削除されたときに実行されます。あなたが指しているデータを使って何かをする必要があるかどうかは、あなたとあなたのコードの間です。

関連する問題