从C++容器中删除对象而不删除它们

Removing objects from C++ containers without deleting them

本文关键字:删除 对象 C++      更新时间:2023-10-16

我使用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_ptrstd::shared_ptr

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

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