Jam*_*off 14 c++ smart-pointers weak-ptr
我使用的代码库部分由一个爱上过度复杂的简单问题解决方案的人实现(例如,有两个参数的模板类只能为一对类型实例化).她做的一件事是在智能指针中创建对象,然后让对象存储一个指向自身的弱指针.
class MyClass {
//...
boost::weak_ptr<MyClass> m_self;
//...
};
boost::shared_ptr<MyClass>
Factory::Factory::Factory::CreateMyClass() {
boost::shared_ptr<MyClass> obj(new MyClass(...));
boost::weak_ptr<MyClass> p(obj);
obj->storeSelfPointer(p);
return obj;
}
Run Code Online (Sandbox Code Playgroud)
然后,类通过锁定并传递生成的共享指针来继续使用m_self.
对于我的生活,我无法理解她想要完成的事情.是否有一些模式或想法可以解释这种实现?在我看来,这是完全没有意义的,我想重构它.
编辑:我应该提到,使用从锁定m_self获得的结果智能指针的任何地方都没有实际保留智能指针.
qua*_*dev 17
这种"设计"的一种可能用途是用来m_self.lock()从中生成共享指针.
如果删除此弱指针成员,生成的共享指针所保持的引用计数this将不正确.
std::enable_shared_from_this有趣的是,它实现了相同的效果,cppreference.com提到了这个设计:
enable_shared_from_this的一个常见实现是将弱引用(例如std :: weak_ptr)保存到此.std :: shared_ptr的构造函数检测到enable_shared_from_this base的存在,并将新创建的std :: shared_ptr分配给内部存储的弱引用
C++标准第20.8.2.4节第10节提到了相同的可能实现:
创建唯一指针的shared_ptr构造函数可以检测enable_shared_- from_this base的存在,并将新创建的shared_ptr分配给其__weak_this成员
可能的重构:
如果您使用的是C++ 11,则可以删除该std::weak_ptr成员,并公开继承std::enable_shared_from_this<T>.您应该通过调用从中检索共享指针shared_from_this().
如果您不使用C++ 11但可以使用boost boost::enable_shared_from_this,请参阅boost文档.您应该通过调用从中检索共享指针shared_from_this().
如果你不使用C++ 11,并且不能使用boost,你可以将标准的建议实现带到你的代码库中,它足够短:
代码:(从§20.8.2.4 - 11复制,删除前导下划线,你可能想要重命名它)
template<class T> class enable_shared_from_this {
private:
weak_ptr<T> __weak_this;
protected:
constexpr enable_shared_from_this() : __weak_this() { }
enable_shared_from_this(enable_shared_from_this const &) { }
enable_shared_from_this& operator=(enable_shared_from_this const &) { return *this; }
~enable_shared_from_this() { }
public:
shared_ptr<T> shared_from_this() { return shared_ptr<T>(__weak_this); }
shared_ptr<T const> shared_from_this() const { return shared_ptr<T const>(__weak_this); }
};
Run Code Online (Sandbox Code Playgroud)
并用于shared_from_this()制作共享指针.如果你复制了这段代码,请注意通过其他方法从中构建共享指针是行不通的.需要修改共享指针构造函数(如上面的标准引言所解释).
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |