C++ で関数を宣言するとします。この関数では、ローカル変数を宣言し、int p=new int [10];
その後いくつかの操作を行い、最後に I を実行しreturn p;
ます。
よく言われるように、 を使用する場合は、 を使用new
する必要がありdelete
ます。でも、この場合は削除すべきではないと思いますよね?そうでなければ、 p を返すことはできませんよね?ただし、 でテストしたときに関数が返すアイテムを削除する必要があるかどうかも考えていますint main()
。
C++ で関数を宣言するとします。この関数では、ローカル変数を宣言し、int p=new int [10];
その後いくつかの操作を行い、最後に I を実行しreturn p;
ます。
よく言われるように、 を使用する場合は、 を使用new
する必要がありdelete
ます。でも、この場合は削除すべきではないと思いますよね?そうでなければ、 p を返すことはできませんよね?ただし、 でテストしたときに関数が返すアイテムを削除する必要があるかどうかも考えていますint main()
。
ルールは、すべてnew
に a delete
(およびすべてnew[]
の a delete[]
* ) が存在する必要がありますが、同じスコープにある必要はありません。関数でオブジェクトを動的に作成し、そのオブジェクトの所有権を呼び出し元に転送するのが一般的です。呼び出し元は、メモリを削除する責任があります。
そうは言っても、コード内でnew
andを直接呼び出すことは避け、安全な他の構造を使用することをお勧めします (メモリは自動的に処理されます)。あなたが言及した特定のケースでは、10個の要素で初期化された a は、ポインターのオーバーヘッドがほとんどなく、オブジェクトが破棄されるたびにメモリが解放されるようにします。delete
std::vector<int>
※実装によっては、スマートポインタにメモリを渡した場合、削除しない場合がありますnew
。new[]
たとえば、C++11 では次のようにできます。
std::unique_ptr<int[]> f() {
std::unique_ptr<int[]> p(new int[10]); // new is unmatched
// ...
return p;
}
へのポインターを処理すると、スコープ外になったときに内部的にstd::unique_ptr
呼び出されることが保証されるため、これは問題delete[]
ありません (別のスマート ポインターに移動されていない場合)。
呼び出し元は、 で作成されたものが返されたことを知っている必要があり、必要に応じnew []
て呼び出しますdelete []
。このような構成では、エラーが発生する可能性がたくさんあります。std::vector
やなど、独自のメモリを処理するものを返すことをお勧めしますstd::unique_ptr
。
delete []
p
新しいスコープでは、作業が完了した後に返されます。ただし、単にメモリを割り当てnew
て所有権を別のスコープに与えることはお勧めできません。std::vector
またはスマートポインターを利用できます。
配列を使用してプログラムが終了したら、削除を行う必要があります。同じ機能である必要はありません。
関数delete
の終了時に常に実行する必要がある場合は、自動的に追加されます (関数の終了時にunique_ptr
何かを自動的に解放するように C++1 に指示する方法ですnew
)。
それらはヒープから割り当てられます。したがって、関数の外側のどこでも削除できますし、削除する必要があります。
New と Delete はスタックを使用しません。malloc と free も同じです。