3

ポインターのベクトルの何が問題なのだろうか。私の友人の何人かは、ベクトルの代わりにリストを使用することを勧めています。これは問題を引き起こしますか:

vector<Fruit*> basket;
basket.push_back(new Apple());
basket.push_back(new Orange());
vector<Fruit*> temp;
temp.push_back(basket[1]);

vector temp を削除すると、basket[1] オブジェクトも破棄されますか? そうでない場合、ポインターのベクトルを使用する際の問題は何ですか?

4

2 に答える 2

6

ベクトルtempを削除した場合、basket [1]オブジェクトも破棄しますか?

いいえ。まず第一に、あなたは削除する tempことはできません; むしろ、スコープ外になると破壊されます。deleteそして、これが発生した場合、ベクトルの要素によってポイントされるオブジェクトは自動的にdされません。

ただし、これは特定の問題ではありませんvector。を使用してlistも、この問題を回避することはできません。問題はむしろ生のポインタにあります。ポイントされたオブジェクトを指す最後のポインターの有効期間が終了したときに、ポイントされたオブジェクトの割り当てが自動的に解除されるようにする場合は、スマートポインターを使用する必要があります。

shared_ptrアプリケーションに必要な所有権ポリシーに応じて、とのいずれかを選択できますunique_ptr。注意点shared_ptrは、相互に参照するオブジェクトが相互に存続するのを防ぐために、参照サイクルを回避する必要があるということです。weak_ptrこの点を確認することをお勧めします。

最後に、を使用しない正当な理由がない限り、コンテナのデフォルトの選択である必要があります。C++11規格のパラグラフ23.2.3/2から:vectorvector

シーケンスコンテナは、プログラマーにさまざまな複雑さのトレードオフを提供するため、それに応じて使用する必要があります。vectorまたははarray、デフォルトで使用されるシーケンスコンテナのタイプですlistまたはforward_list、シーケンスの途中から頻繁に挿入および削除される場合に使用する必要があります。dequeは、ほとんどの挿入と削除がシーケンスの最初または最後に行われる場合に選択されるデータ構造です。

于 2013-02-21T17:27:59.130 に答える
3

ベクトルbasketまたはのいずれかtempが破棄された場合、いずれの も破棄されませんFruit。動的に割り当てられるものはすべてdでnewなければなりません。ベクトルが範囲外に出ても、その要素が指すオブジェクトには影響しdeleteません。1 つのベクトルを介して別のベクトルで指されているオブジェクトのdelete場合、両方とも現在のオブジェクトを指します。deletedelete

ベクトルには自動保存期間があるため、絶対にやらないdelete basket;でくださいdelete temp;

一般に生ポインタを使用することはお勧めできません。特に、忘れる可能性のある動的に割り当てられたストレージではそうですdelete。ただし、この場合、ポインターによって提供されるポリモーフィックな動作が必要です。生のポインターの問題を回避するには、スマート ポインターを使用する必要があります。を試してくださいstd::vector<std::shared_ptr<Fruit>>

于 2013-02-21T17:26:32.183 に答える