如何避免将“此”指针与智能指针结合使用?是否有任何设计模式/一般建议来解决这个问题?
我想把两者结合在一起是不可能的,因为两者都是:
为了给出一些上下文,我最近了解了将STL容器与对象组合(重复浅层复制、在使用基类容器时切片等)的负面影响,因此我将用指向对象的智能指针替换代码中的这些用法。有几个对象使用"this“指针传递对自己的引用,这正是我被困的地方。
我发现smart pointers + “this” considered harmful?问到了一个类似的问题,但答案没有用,因为我没有使用Boost。
编辑:我一直在做的一个(精心设计的)例子是
...::AddToProcessingList(vector<CSmartPtr> &vecPtrs)
{
vecPtrs.push_back(CSmartPtr(this));
}发布于 2009-09-02 00:12:41
将两者结合起来是可以做到的,但你总是需要在头脑中清楚地了解所有权问题。通常,我遵循的规则是永远不要将原始指针转换为智能指针(带有所有权),除非您确信在这一点上您获得了对象的所有权。这样做是安全的,这是显而易见的,但包括以下内容:
您刚刚创建的对象(通过new)
add传递给容器类)
中。
只要您遵循规则,并且您没有任何模糊的所有权情况,那么就不应该出现任何问题。
在上面的例子中,我可以这样看待它们:
。
在这种情况下,由于您正在传递本机指针,您可以根据我的规则假设您没有传递所有权,因此无法将其转换为智能指针。
如果将"this“指针包装在正在使用的智能指针中,例如”返回“(CSmartPtr(This);),则可以有效地设置管理同一个对象的多个智能指针,以便第一个引用计数为零的指针将从另一个下销毁该对象。
这显然是非法的,因为您已经说过该对象已经被其他智能指针所拥有。
如果在这些情况下有一个包含(This)值的成员变量返回,则最终将是一个循环引用,从而使引用计数始终为1。。
如果某些外部代码隐式地拥有成员变量,则实际上可以对其进行管理--该代码可以在释放对象之前的某个点调用某种close()方法。显然,经过反思,该外部代码拥有该对象,因此它本身确实应该有一个智能指针。
boost库(我接受您已经说过您没有使用)使这些问题更易于管理,因为它将智能指针库划分为不同类型的所有权(范围、共享、弱等等)。
发布于 2009-09-02 00:10:53
大多数智能指针框架都提供了一种解决这一问题的方法。例如,Boost.SmartPtr提供了一个作为基类使用的enable_shared_from_this<T> CRTP类,然后可以确保共享指针不会导致指向同一个对象的两个指针。
发布于 2009-09-02 07:51:52
解决此问题的一个相当健壮的解决方案是使用侵入式智能指针。要实例化RefCountedPtr<T>,T应该从RefCount派生。这允许从this构造this,因为this->RefCount::m_count持有决定生存期的单个计数器。
缺点:当您将对象放到堆栈上时,您有一个未使用的RefCount。
https://stackoverflow.com/questions/1365206
复制相似问题