単純なシーングラフの実装のためにレンダリングオブジェクトを格納するためにC++stdベクトルを使用しています。シーングラフから実行時にレンダリングオブジェクトを追加および削除する機能が必要です。追加は問題ありません。削除する場合:ベクトルなどのドキュメントを読むC ++コンテナは、オブジェクトがポップされるとデストラクタが呼び出されるように見えますが、後でそれらのオブジェクトをレンダリングループに再度追加できるようにしたいので、これは必要ではありません。この問題の可能な解決策は何ですか。言及するのを忘れた重要な詳細-レンダリングオブジェクトへのポインタのベクトルを使用しています。
3 に答える
オブジェクト インスタンスの基本的な概念と混同しているようです。ベクトルに何かを追加するときは、その中に移動するのではなく、コピーします。
vector<string> vec;
string s;
vec.push_back(s);
vec[0]
ではなく s
、のコピーですs
。したがって、ベクトルから削除しても、影響s
はありません。
コピーが必要ない場合は、代わりにポインターに切り替える必要があります。ベクターからポインターを削除すると、ポインターが指すオブジェクトのデストラクタは呼び出されなくなります。
編集: OK、既にポインターを使用しているようです。あなたが言った:
ベクトルおよびその他の C++ コンテナーのドキュメントを読むと、オブジェクトがポップされると、デストラクタが呼び出されるように見えます
それは本当です。ベクターからポインターを削除すると、ポインターが破棄されます。それがドキュメントの意味です。ポインターが指すオブジェクトが破棄されているという意味ではありません。
vector<string*> vec;
string s;
vec.push_back(&s);
vec.pop_back();
s
まったく影響を受けません。ポップ操作によって破壊されるのは、それ自体でs
はなく、のアドレスを保持するポインターです。s
だからあなたは元気です。
これを正しく機能させるには、所有権を認識する必要があります。使用しているベクトルが一時的なもので、オブジェクトを観察するためだけのものである場合は、点のベクトルを使用してください。
std::vector<object*> x;
それが破壊vector
されても、指し示されているオブジェクトは影響を受けません。
所有権を共有する場合は、boost::shared_ptr
またはを使用しstd::shared_ptr
ます。
ポインタがポップされると、デストラクタは呼び出されません。概念的には、プリミティブ型にもデストラクタがあり、スコープ外になったときに何が起こるかを説明しています。ポインターのベクトルを破棄することは、一連のローカル ポインター変数をスコープ外にすることと同じです。
参照カウントスマート ポインター*
は、 and->
演算子をオーバーロードしてポインターのように動作させるオブジェクトです。これらは、デストラクタを実装して、ポイント先のオブジェクトを破棄し、所有権を実装します。しかし、シーン グラフの場合、それはおそらく不要です。