2012-11-25 96 views
4

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

+3

存储从其他地方管理的对象的智能指针。 – juanchopanza

+2

删除它们之前不会复制它们是一种解决方案吗?或者,在C++ 11的情况下,将它们移出? – jogojapan

+1

@juanchopanza我会说“智能指针”或“从其他地方管理”,看不出这两者如何混合。 – Kos

回答

7

看起来你很迷惑对象实例的基本概念。当你添加了一些为向量,你不将其移动到它,你把它复制:

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

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

如果你不想要副本,你应该切换到指针。你可以从vector中移除指针,它们指向的对象的析构函数将不会被调用。

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

矢量和其他C++集装箱阅读文档,似乎当 对象被弹出他们的析构函数被称为

这是事实。当你从向量中移除一个指针时,指针正在被破坏。这就是文档的意思。这并不意味着要被被破坏掉的对象指针指向:

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

s完全没有受到影响。流行操作破坏的是指针,其地址为s,而不是s本身。

所以你很好。

+0

是的,我知道它:)我忘了提及我正在使用指针向量。 –

+1

@MichaelIV:指针会被销毁,但是他们指向的东西不会。 (只要你正确地管理被指向的对象的生命周期,你就没事了)。 – Mankarse

+2

@MichaelIV然后你没有问题;当你从向量中移除指针时,只有指针被销毁,而不是指针指向的对象。 –

3

您需要注意所有权才能使其正常工作。如果您使用的矢量只是临时的,只能观察对象,则只需使用点矢量即可。

std::vector<object*> x; 

销毁该vector指向的对象不受影响。

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

2

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

引用计数智能指针是过载运算符*->的对象,其行为与指针类似。他们确实实施了析构函数来销毁指向对象,从而实现所有权。但对于场景图,这可能是不必要的。

相关问题