1

私はこのようなことをすると言う

for(int i = 0; i < 10; i++)
{
    //create a pointer object using new
    //use the object
}

ループで使用した後、ポインター オブジェクトを削除する必要がありますか? 私はそれを削除しなければ、新しいオブジェクトを10回作成し続け、その後オブジェクトはそこにぶら下がってリソースを消費するだろうと考えていました。

4

5 に答える 5

5

はい、すべて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++ でプログラミングするのですか?)

于 2010-11-18T20:26:08.920 に答える
4

うん。

必要がなくなったら、新しく作成したものを削除する必要があります。そうしないと、メモリ リークが発生します。

于 2010-11-18T20:18:47.843 に答える
1

はい、技術的にはそれらを削除する必要があります。

しかし。これを自動的に魔法のように行うスマート ポインターと呼ばれる驚くべき機能があります。

for(int i = 0; i < 10; i++)
{
    std::auto_ptr<int> x(new int(10));

    // automatically deleted after each iteration.
}
于 2010-11-18T20:26:05.200 に答える
0

あなたが非常に傾いている場合は、スマート ポインター (Boost の shared_pointer のようなもの) を使用できます。その後、ポインターが最後に範囲外になるとすぐに、オブジェクトは自動的に削除されます。

于 2010-11-18T20:25:04.083 に答える
0

はい、削除する必要があります。しかし、ループの反復ごとに新規作成/削除を行うことは、最良の選択肢ではない可能性があります。より良いアドバイスを得るには、より多くのコンテキストを提供する必要があります。

于 2010-11-18T20:25:06.690 に答える