私はこのようなことをすると言う
for(int i = 0; i < 10; i++)
{
//create a pointer object using new
//use the object
}
ループで使用した後、ポインター オブジェクトを削除する必要がありますか? 私はそれを削除しなければ、新しいオブジェクトを10回作成し続け、その後オブジェクトはそこにぶら下がってリソースを消費するだろうと考えていました。
私はこのようなことをすると言う
for(int i = 0; i < 10; i++)
{
//create a pointer object using new
//use the object
}
ループで使用した後、ポインター オブジェクトを削除する必要がありますか? 私はそれを削除しなければ、新しいオブジェクトを10回作成し続け、その後オブジェクトはそこにぶら下がってリソースを消費するだろうと考えていました。
はい、すべてnew
に対応する が必要delete
です。(そしてdelete[]
for every new[]
。)
ただし、C++ の方法では、動的ストレージを可能な限り回避し、代わりにローカルの自動変数を使用します。
for(int i = 0; i < 10; ++i)
{
some_class object;
//use object
} // object gets destroyed here automatically
そのオブジェクトを動的に割り当てる必要がある場合 (疑いますが、そのような場合もあります)、スマート ポインターを使用します。スマート ポインターは、delete
属するスコープをどのように離れても、自動的に実行されます。
for(int i = 0; i < 10; ++i)
{
smart_ptr<some_class> object(new some_class());
//use object
} // object gets destroyed here automatically
std::auto_ptr
現在の標準では、この場合に必要なことを実行するという名前のスマート ポインターが 1 つだけ認識されます。次の標準には、さらにいくつかの標準が付属します。その中にはstd::auto_ptr
、namedの代わりstd::unique_ptr
となるものと、共有所有権セマンティックを持つ named がありstd::shared_ptr
ます。あなたのコンパイラ/標準ライブラリは、実際にはすでにそれらをサポートしているかもしれません。そうでない場合は、 boostにある多くの優れたライブラリの中からそれらを見つけることができます。
i++
ところで、私はあなたをに置き換えたことに注意してください++i
。これの場合、int
シナリオに違いはありませi++
んが、不要なコピーを作成する可能性のあるタイプがあります。(効率が気にならないなら、なぜ C++ でプログラミングするのですか?)
うん。
必要がなくなったら、新しく作成したものを削除する必要があります。そうしないと、メモリ リークが発生します。
はい、技術的にはそれらを削除する必要があります。
しかし。これを自動的に魔法のように行うスマート ポインターと呼ばれる驚くべき機能があります。
for(int i = 0; i < 10; i++)
{
std::auto_ptr<int> x(new int(10));
// automatically deleted after each iteration.
}
あなたが非常に傾いている場合は、スマート ポインター (Boost の shared_pointer のようなもの) を使用できます。その後、ポインターが最後に範囲外になるとすぐに、オブジェクトは自動的に削除されます。
はい、削除する必要があります。しかし、ループの反復ごとに新規作成/削除を行うことは、最良の選択肢ではない可能性があります。より良いアドバイスを得るには、より多くのコンテキストを提供する必要があります。