我正在使用C++ std向量来存储渲染对象,用于简单的场景图实现。我需要能够在运行时从场景图中添加和删除渲染对象.Adding不是问题,为了消除:阅读向量和其他C++容器的文档,看起来当对象被弹出时,它们的析构函数被调用。这不是我需要的,因为我希望能够稍后将这些对象重新添加到渲染循环中。是否可以解决这个问题? 重要细节我忘记提及 - 我正在使用指向渲染对象的向量。从C++容器中删除对象而不删除它们
回答
看起来你很迷惑对象实例的基本概念。当你添加了一些为向量,你不将其移动到它,你把它复制:
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
本身。
所以你很好。
是的,我知道它:)我忘了提及我正在使用指针向量。 –
@MichaelIV:指针会被销毁,但是他们指向的东西不会。 (只要你正确地管理被指向的对象的生命周期,你就没事了)。 – Mankarse
@MichaelIV然后你没有问题;当你从向量中移除指针时,只有指针被销毁,而不是指针指向的对象。 –
您需要注意所有权才能使其正常工作。如果您使用的矢量只是临时的,只能观察对象,则只需使用点矢量即可。
std::vector<object*> x;
销毁该vector
指向的对象不受影响。
如果要共享所有权,请使用boost::shared_ptr
或std::shared_ptr
。
当指针被弹出时,不会调用析构函数。从概念上讲,即使是原始类型也有析构函数,以解释当它们超出范围时会发生什么。销毁指针向量与使一堆本地指针变量超出范围相同。
引用计数智能指针是过载运算符*
和->
的对象,其行为与指针类似。他们确实实施了析构函数来销毁指向对象,从而实现所有权。但对于场景图,这可能是不必要的。
- 1. 从数组中删除对象而不从数据库中删除它
- 2. 如何从boost :: ptr_vector中删除指针而不删除对象?
- 3. 从列表中删除项目不从RecyclerView中删除它们?
- 4. 从活动记录关系中删除对象而不删除它
- 5. ArrayLists的对象,如何添加/从对象中删除它们?
- 6. 删除删除了关联对象,而在数据库中删除它
- 7. Django的 - 删除对象,而不删除其相关对象
- 8. 休眠 - 删除对象引用而不删除对象
- 9. 休眠删除对象而不删除相关对象
- 10. 循环对象,然后删除它们
- 11. 从UITableView中删除项目(不删除它们)
- 12. 删除单元而不移动它们
- 13. 删除从Rails管理列表,而不从实际的博客删除它们
- 14. 从对象中删除值而不改变它
- 15. 如何删除文件的内容而不删除它自己?
- 16. 如何从行对象中删除行,而不是从数据库中删除?
- 17. 如何从服务中删除吊舱而不删除它
- 18. 删除C++中的对象;
- 19. 是否可以从上下文中删除托管对象,而不是从对多关系中删除它NSSet
- 20. 如何隐藏记录,而不是删除它们(从头开始软删除)
- 21. 从容器中删除元素时,通过它们迭代
- 22. 从MEF容器中删除
- 23. 何时从C++堆中删除对象?
- 24. 从对象中删除空数组-c
- 25. 从C++列表中删除对象
- 26. C++从内存中删除对象
- 27. 显示LinkedStack的内容而不删除它们
- 28. 从CoreData中删除对象
- 29. 从JSONArray中删除对象
- 30. 从对象中删除值
存储从其他地方管理的对象的智能指针。 – juanchopanza
删除它们之前不会复制它们是一种解决方案吗?或者,在C++ 11的情况下,将它们移出? – jogojapan
@juanchopanza我会说“智能指针”或“从其他地方管理”,看不出这两者如何混合。 – Kos