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[] * ) が存在する必要がありますが、同じスコープにある必要はありません。関数でオブジェクトを動的に作成し、そのオブジェクトの所有権を呼び出し元に転送するのが一般的です。呼び出し元は、メモリを削除する責任があります。
そうは言っても、コード内でnewandを直接呼び出すことは避け、安全な他の構造を使用することをお勧めします (メモリは自動的に処理されます)。あなたが言及した特定のケースでは、10個の要素で初期化された a は、ポインターのオーバーヘッドがほとんどなく、オブジェクトが破棄されるたびにメモリが解放されるようにします。deletestd::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 も同じです。