0

私のコードには、のオブジェクトへのポインタのベクトルと、次のオブジェクトへのポインタをSomeClass含む(カスタム比較)ベクトルベースの優先度キューがありますSomeClass

std::vector<SomeClass*> my_vector;
std::priority_queue<SomeClass*, vector<SomeClass*>, CustomCompare> my_queue;

最初my_vectorは空で、my_queueいっぱいです。徐々にこのようmy_queueに空になりmy_vectorます:

my_vector.push_back(my_queue.top());
my_queue.pop();

私の質問は次のとおりです。プッシュバックされmy_queue.pop()たオブジェクトに割り当てられたメモリを削除するため、の要素がダングリングポインタになりますか?それ以外の場合、ベクトルは、によって返されるポインタが指すオブジェクトの深いコピーまたは浅いコピーを作成しますか?SomeClassmy_vectormy_vectormy_queue.top()

4

5 に答える 5

1

削除は行われません。コピー/削除/pushed_backされるのはポインタだけです。これらのオブジェクトは、動的に割り当てられている場合、存続することを指します。その場合、自分でクリーンアップを行う必要があります。

必要な動作に応じて、スマートポイトナーを使用して、手動のメモリ管理を回避しSomeClassたり、ポインターの代わりにオブジェクトを格納したり、そのままにして最後にクリーンアップを行ったりすることができます。プログラムがメモリが解放されるポイントに安全に到達することを保証するのは難しい場合があることに注意してください。これが、動的に割り当てられたオブジェクトへのrawポインタよりもスマートポインタが優先される理由の1つです。

于 2012-08-21T11:44:08.860 に答える
1

my_queue.pop()キューに保存されているオブジェクトのみを削除します。この場合、ポインタが指すオブジェクトではなく、ポインタ自体です。だからあなたはここで元気です。

必須の注意:生のポインターの代わりにスマートポインターの使用を検討してください。

于 2012-08-21T11:45:06.160 に答える
0

キューとベクターの両方にポインターのみが含まれています。スマートポインタまたは共有ポインタを使用しない限り、キューのデストラクタもベクトルのデストラクタもメモリを解放しません。

于 2012-08-21T11:43:31.617 に答える
0

いいえ。ポインターを格納するため、ポインターをコピーして破棄します(これはノーオペレーションです)。魔法は関係ありません。同じオブジェクトへのポインタを同時に格納しない場合は、作成unique_ptrしてから、最終的にオブジェクトを破棄する場合はsを格納することをお勧めします。または、実際のオブジェクトを3番目のベクトル(vector<SomeClass>)に格納し、ベクトルとポインターのキューを別々に維持することもできます。

于 2012-08-21T11:45:01.217 に答える
0

どこにでもSomeClassオブジェクトへのポインターを格納しているので、my_queue.pop()がポインターをキューから削除することはなく、オブジェクトは正常です。ポインターのコピーは、ディープコピーではなく、vectorに格納されます。

于 2012-08-21T11:47:29.980 に答える