对可删除对象的非持有参考

Non owning reference to deleteable object

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

可以删除非拥有的最佳实践,可以删除?

第一部分相当简单,我只是使用愚蠢的智能指针:observer_ptr。但是,最后一部分使它变得更加困难。

示例

拥有此设置,以说明我的向量唯一ptr

的需求
class Object
{
    
};
class Derrived : public Object
{
    
};

实施

vector<nonstd::observer_ptr<Object>> _observers;
vector<unique_ptr<Object>> _objects;
auto t = make_unique<Derrived>();
_observers.push_back(nonstd::make_observer(t.get()));
_objects.push_back(move(t));
// Same objects
cout << (_observers.at(0).get() == _objects.at(0).get()) << endl;

问题

现在任何时候,某个地方,_objects中的一个对象可能被删除。

我将通过删除向量中的第一个对象来说明这一点:

_objects.erase(_objects.begin());

这将导致_objects向量为空。但是,_observers向量现在指向释放的内存空间。

当然,我可以简单地将观察者从_observers中删除,但可以想象在程序的不同部分中有这样的观察参考。

是否有任何更清洁的解决方案,这是观察不同对象的正确方法?


请告诉我,如果手头的示例没有说明我描述的问题(或任何问题)。

您的用例听起来像std::weak_ptr<Object>是合适的非持有表示形式。当然,对于std::weak_ptr<T>,拥有的表示为std::shared_ptr<T>。但是,由于您需要在访问std::weak_ptr<T>之前"固定"对象,无论如何您在访问指针时都会有多个所有者。

如注释中所述,这是std::weak_ptr的典型用例:

std::weak_ptr是一个智能指针,可容纳非持有("弱") 引用由std::shared_ptr管理的对象。一定是 转换为std::shared_ptr以访问引用对象。

示例:

vector<shared_ptr<Object>> objects;
objects.push_back(make_shared<Derived>());
weak_ptr<Object> ptr{ objects.back() };
auto sh_ptr = ptr.lock(); // increase reference count if object is still alive
if(sh_ptr) { // if object was not deleted yet
   sh_ptr->doStuff(); // safely access the object, as this thread holds a valid reference
}

今天,编译器无法实现非所有关系:1. feal_ptr可以转换为shared_ptr2.其他所有内容都可以删除。3.围绕free_ptr的包装器也不可转换为共享_ptr也无法使用:一旦检索到对象也可以删除。