1

次のようなポインターのベクトルがあります。

std::vector<foo*> stuff;

各要素を次のように初期化しますnew foo();

私の質問は、ベクトルの要素の 1 つを再割り当てするとどうなるかということです。

stuff[3] = new foo();

私はメモリをリークしていdelete[]ますか?この前に呼び出す必要がありましたか? これは、スマート ポインターを使用する必要があるケースですか? (今まで一度もありません)

通常、私は new を使用しませんが、私は Qt を学んでおり、これが例で行われているようです。Qt には独自のスマート ポインターがあるようです。それらのいずれかを使用する必要がありますか?

ありがとう。

4

5 に答える 5

1

はい、ベクトルを反復処理して削除を呼び出さない限り、破壊されたときにリークし、stuff動的に割り当てられたすべての動的割り当てfooが削除されず、到達不能になります。

通常、使用するポインターのベクトルが必要な場合std::shared_ptr

std::vector<std::shared_ptr<foo>> stuff;

stuff[3] = std::make_shared<foo>();

ベクトルが巨大で、それをコピーしようとすると (別の shared_ptr でラップしたい場合)、パフォーマンスのボトルネックになる可能性がありますが、ベクトルの要素にのみアクセスしている場合は、誰が削除するかに関するすべての問題が解消されます。何をいつ、生のポインターアプローチに付属します。

于 2013-05-11T16:12:21.967 に答える
0

あなたのコードには Qt との関係はありません。new でオブジェクトを割り当てた後、delete を呼び出さないとメモリ リークが発生します。そのベクトルでループを実行し、各アイテムで削除を呼び出すために何をすべきか。

于 2013-05-11T16:13:22.237 に答える
0

QObjects の場合fooは、それぞれに親を割り当てます (手動で削除することもできますが、親はそれらを削除する責任があります)。その場合、所有権の競合が発生するため、スマート ポインターを使用しないでください。

于 2013-06-29T01:47:22.060 に答える
0

ベクトルはオブジェクトのコピーを作成し、そのコピーを保存します。あなたの例では、ベクトルはタイプfoo*です。そのため、へのポインターが渡されるとfoo、 vector はfooそれ自体ではなく、ポインターのコピーを作成します。再割り当てして他のことを行うと、ポインターのコピーはベクトルによって解放されますが、ポインターが指すメモリは解放されません。キーのベクトルがあると想像してください。ベクトルは渡されたキーのコピーを作成し、キーのコピーを解放します。しかし、鍵があるロックには決して触れません。自分で処理する必要があること。再割り当てする前に、自分で値を取得して要素を解放できます。

于 2013-05-11T16:43:27.027 に答える