非拥有对可删除对象的引用

时间:2017-12-13 22:40:18

标签: c++ c++11

保存对象的非拥有引用的最佳做法是什么,可以删除?

第一部分相当简单,我只是使用愚蠢的智能指针:class Object { }; class Derrived : public Object { }; 。然而,最后一部分使其更加困难。

实施例

进行此设置,以说明我的矢量唯一ptr的需要

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向量现在指向释放的内存空间。

当然,我可以简单地从WITH cte AS ( SELECT ColA , ColB , ColC , ColD , SUM(CASE WHEN L < ColB THEN 0 ELSE 1 END) OVER (ORDER BY ColA) GroupID FROM ( SELECT ColA , ColB , ColC , ColD , LAG(ColB, 1, NULL) OVER (ORDER BY ColA) L FROM YourTable ) Q ) SELECT C1.ColC , C2.ColD FROM cte C1 JOIN cte C2 ON C1.GroupID = C2.GroupID ORDER BY C2.ColA 删除观察者,但想象在我的程序的不同部分有这样的观察引用。

对此有没有更清洁的解决方案,这是观察不同物体的正确方法吗?

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

3 个答案:

答案 0 :(得分:4)

您的用例听起来像std::weak_ptr<Object>将是合适的非拥有代表。当然,对于std::weak_ptr<T>拥有的表示是std::shared_ptr<T>。但是,由于您需要在访问std::weak_ptr<T>之前“固定”对象,因此在访问指针时您仍然拥有多个所有者。

答案 1 :(得分:2)

如评论中所述,这是std::weak_ptr的典型用例:

  

std::weak_ptr是一个智能指针,它拥有一个非拥有者(&#34;弱&#34;)   引用由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
}

答案 2 :(得分:0)

今天,没有办法使编译器强制执行非所有权关系: 1.weak_ptr可以转换为shared_ptr 2.其他所有内容均可删除。 3.不可转换为shared_ptr的weak_ptr周围的包装也不起作用:一旦检索到对对象的引用,也可以将其删除。