对可删除对象的非持有参考
Non owning reference to deleteable object
可以删除非拥有的最佳实践,可以删除?
第一部分相当简单,我只是使用愚蠢的智能指针: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也无法使用:一旦检索到对象也可以删除。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 为什么合成的复制分配运算符被定义为如果类有参考成员,则将其定义为删除
- C 将对象删除为参考
- 为什么此C 代码不起作用 - 试图删除集合中的元素时,请参考错误
- 通过参考const成员通过参考时,尝试引用已删除的函数
- 对可删除对象的非持有参考
- 为什么删除字符串迭代器会产生const char参考
- 为什么参考可以保存指针指向指针的内容,即使指针已删除
- JNI检测到应用程序中的错误:使用已删除的弱全局参考
- 我已经创建了一个精灵的否,并以相同的参考将它们添加到场景中,现在,如何使用标签删除它们
- 如何删除自己与参考
- 为什么我不能删除我的节点和参考