从C++容器中删除对象而不删除它们
Removing objects from C++ containers without deleting them
我使用C++std向量来存储用于简单场景图实现的渲染对象。我需要能够在运行时从场景图中添加和删除渲染对象。添加不是问题,对于移除来说:读取vector和其他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();
CCD_ 5完全不受影响。pop操作破坏的是保存s
地址的指针,而不是s
本身。
所以你很好。
您需要意识到所有权才能正常工作。如果所使用的矢量只是临时的,并且仅用于观察对象,则只需使用点的矢量即可。
std::vector<object*> x;
在销毁vector
时,所指向的对象不受影响。
如果要共享所有权,请使用boost::shared_ptr
或std::shared_ptr
。
当指针弹出时,不会调用析构函数。从概念上讲,即使是基元类型也有析构函数,用来解释当它们超出范围时会发生什么。销毁一个指针向量与让一堆局部指针变量超出范围是一样的。
引用计数的智能指针是重载*
和->
运算符以使其行为类似指针的对象。它们确实实现了析构函数来销毁指向的对象,从而实现了所有权。但对于场景图来说,这可能是不必要的。
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象