保存对象的非拥有引用的最佳做法是什么,可以删除?
第一部分相当简单,我只是使用愚蠢的智能指针: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
删除观察者,但想象在我的程序的不同部分有这样的观察引用。
对此有没有更清洁的解决方案,这是观察不同物体的正确方法吗?
如果我手边的例子没有说明我所描述的问题(或任何问题),请告诉我。
答案 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周围的包装也不起作用:一旦检索到对对象的引用,也可以将其删除。