7

我正在使用 C++ 标准向量来存储渲染对象以实现简单的场景图实现。我需要能够在运行时从场景图中添加和删除渲染对象。添加不是问题,对于删除:阅读向量和其他文档C++ 容器似乎在弹出对象时调用了它们的析构函数。这不是我需要的,因为我希望稍后能够将这些对象重新添加到渲染循环中。这个问题的可能解决方案是什么?我忘记提及的重要细节 - 我正在使用指向渲染对象的指针向量。

4

3 回答 3

11

您似乎对对象实例的基本概念感到困惑。当您将某些内容添加到矢量时,您不会将其移动到其中,而是复制它:

vector<string> vec;
string s;
vec.push_back(s);

vec[0]不是 s它是副本s。所以当你从向量中删除它时,s不会受到影响。

如果您不想要副本,则应改为使用指针。您可以将它们从向量中删除,并且不会调用它们指向的对象的析构函数。

编辑:好的,看来您已经在使用指针了。你说:

阅读矢量和其他 C++ 容器的文档,似乎在弹出对象时调用了它们的析构函数

那是真实的。当您从向量中删除指针时,指针将被破坏。这就是文档的意思。这并不意味着指针指向的对象正在被破坏:

vector<string*> vec;
string s;
vec.push_back(&s);
vec.pop_back();

s完全不受影响。被弹出操作破坏的是保存地址的指针,而s不是s它本身。

所以你没事。

于 2012-11-25T10:19:04.320 回答
3

您需要了解所有权才能使其正常工作。如果您使用的向量只是临时的并且仅用于观察对象,则只需使用点向量。

std::vector<object*> x;

在销毁时,vector指向的对象不受影响。

如果您想共享所有权,请使用boost::shared_ptrstd::shared_ptr

于 2012-11-25T10:21:45.800 回答
2

弹出指针时,不会调用析构函数。从概念上讲,即使是原始类型也有析构函数,以解释当它们超出范围时会发生什么。销毁指针向量与使一堆局部指针变量超出范围相同。

Reference-counted smart pointers are objects that overload the * and -> operators to behave like pointers. They do implement the destructor to destroy the pointed-to object, thus implementing ownership. But for a scene graph, that's probably unnecessary.

于 2012-11-25T10:24:04.120 回答