2

new私の質問は、関数呼び出し内にある演算子で割り当てられたオブジェクトはどうなるかということです。

pV具体的な例:クラス外のオブジェクト/関数に送信したいプライベートベクトルがありますfoo->func(std::vector<int> *vec)。私は最初に書き込もうとしました

foo->func( new std::vector<int>(pV) )

ただし、これによりメモリリークが発生しました(この関数がループ内で繰り返し呼び出された場合)。関数と呼ばれる新しいオブジェクトを具体的に作成し、そのオブジェクトを削除すると、メモリリークなしですべてが機能しました。

新しく作成されたオブジェクト'expire'は、関数が戻ったときに削除されるべきではありませんか?そうでない場合、呼び出された関数の内部からオブジェクトを削除するにはどうすればよいですか?そして、どちらがより良いアプローチですか?

4

3 に答える 3

7

C++ では、新しいオブジェクトが「期限切れになる」というようなことはありません。ガベージ コレクションや参照カウント言語ではないため、newまたはで割り当てたオブジェクトのすべてのメモリ管理を手動でコーディングする必要がありますnew[]

unique_ptrこの特定のケースでは、自動削除を確実にするために使用できます。

for (int i = 0 ; i != 10000 ; i++) {
    std::unique_ptr<std::vector<int> > tmp = new std::vector<int>(pV);
    foo->func(tmp);
}

deleteが存在するようにdeleteは見えませんが、ここには魔法はありませんunique_ptr

より良い解決策は、ベクトルを自動ストレージに割り当て、へのポインターを渡すことfoo->funcです。

for (int i = 0 ; i != 10000 ; i++) {
    std::vector<int> tmp(pV);
    foo->func(&tmp);
}
于 2012-05-08T16:23:08.810 に答える
2

最良のアプローチはどちらでもないと思います。単純に自分自身を渡しpVます。(コピーコンストラクターによって)コピーされるため、とにかく新しいベクターが作成されます。関数が戻ると自動的に破棄されます。

于 2012-05-08T16:24:35.593 に答える
2

で割り当てられたオブジェクトは、new最終的に で解放する必要deleteがあります。そうしないと、リークが発生します。での割り当てnewは、関数呼び出しとは無関係です。ある関数で で何かを作成newし、別の関数で問題なく解放deleteできます。

関数で割り当てられ、関数の終了時に解放されるオブジェクトが必要な場合は、次のようにします。

void foo(...) {
    // some code

    MyClass myobj(...); // object allocated here
    // some more code
    return; // object freed here (or whenever function exits)
}

オブジェクトへのポインターを関数に渡す必要がある場合はnew、そのためにも使用する必要はありません。&次の演算子を使用できます。

std::vector<int> myvec(pV);
foo->func(&myvec);

この場合myobj、スタックに配置され、関数が終了すると自動的に削除される自動変数です。この場合、使用する必要はありませんnew

于 2012-05-08T16:26:43.537 に答える