2

私はベクトルを持っています:

std::vector<std::unique_ptr<myClass>> vec;
//filling the vector
vec.push_back(std::unique_ptr<myClass>(new myClass()));
vec.push_back(std::unique_ptr<myClass>(new myClass()));
vec.push_back(std::unique_ptr<myClass>(new myClass()));

myClass所有権について心配する必要のない特定のインスタンスへのハンドルが必要です。例:

std::unique_ptr<myClass>& myInstance;

問題は、実行時にmyInstanceのさまざまなインスタンスを指す必要があることですmyClass

を使用できることはわかっていますがstd::shared_ptr、それらを保持したいstd::unique_ptrので、すでに初期化されているものが追加された場合、所有権はに転送されvecます。

?へのポインタを保持するにはどうすればよいstd::unique_ptrですか?

さらに、ここで生のポインターを使用することは悪い習慣と見なされますか?ポインタはリソースを管理する必要はありませんが、コードが混乱することは望ましくありません。

4

1 に答える 1

3

あなたの投稿へのコメントは、「所有していない」容量で生のポインタを使用することは問題ないはずであることを示しています。私はその一般的な感情に同意する傾向がありますが、あなたのケースはさらに調査する必要があります。

あなたの状況では、「std::unique_ptrへのポインタ」を使用しないでください。問題は、あなた(またはメンテナンスプログラマー)がベクトルに追加すると、ベクトルが再割り当てされる可能性があることです。含まれている場合、ポインタは無効になっているため、使用しないでください。

1つのオプションは、ポインターの代わりにベクトルへのインデックスを使用することです。これには、ベクター内のエントリを削除または再配置した場合に破損するという問題があります。

もう1つのより堅牢なオプションは、実際のmyClassオブジェクトを所有するunique_ptrではなく、実際のmyClassオブジェクトへのポインターを直接使用することです。このオプションは、通常のオブジェクトのベクトルの代わりに、オブジェクトのunique_ptrsのベクトルを使用することで有効になります。

于 2012-08-31T04:13:36.857 に答える