首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“此”指针和智能指针应该混合吗?

“此”指针和智能指针应该混合吗?
EN

Stack Overflow用户
提问于 2009-09-01 23:49:39
回答 3查看 1.5K关注 0票数 2

如何避免将“此”指针与智能指针结合使用?是否有任何设计模式/一般建议来解决这个问题?

我想把两者结合在一起是不可能的,因为两者都是:

  1. 您正在传递一个本机指针到一个智能指针管理对象,该对象一开始就不需要使用智能指针,如果在使用时将"this“指针包装在一个智能指针中,则为
  2. ,例如”返回CSmartPtr(this);",您已经有效地设置了管理同一个对象的多个智能指针,因此第一个引用计数为零的指针将从另一个对象下销毁该对象,或者
  3. ,如果您有一个成员变量保存CSmartPtr(this)的值,在这些情况下,它最终将是一个循环引用,其结果是引用计数始终是一个。

为了给出一些上下文,我最近了解了将STL容器与对象组合(重复浅层复制、在使用基类容器时切片等)的负面影响,因此我将用指向对象的智能指针替换代码中的这些用法。有几个对象使用"this“指针传递对自己的引用,这正是我被困的地方。

我发现smart pointers + “this” considered harmful?问到了一个类似的问题,但答案没有用,因为我没有使用Boost。

编辑:我一直在做的一个(精心设计的)例子是

代码语言:javascript
复制
...::AddToProcessingList(vector<CSmartPtr> &vecPtrs)
{
    vecPtrs.push_back(CSmartPtr(this));
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-02 00:12:41

将两者结合起来是可以做到的,但你总是需要在头脑中清楚地了解所有权问题。通常,我遵循的规则是永远不要将原始指针转换为智能指针(带有所有权),除非您确信在这一点上您获得了对象的所有权。这样做是安全的,这是显而易见的,但包括以下内容:

您刚刚创建的对象(通过new)

  • you传递对象从某个外部方法调用,其中语义显然是所有权之一(例如,将add传递给容器类)

  • ,该对象被传递到另一个线程

中。

只要您遵循规则,并且您没有任何模糊的所有权情况,那么就不应该出现任何问题。

在上面的例子中,我可以这样看待它们:

  1. ,您正在传递一个本机指针到智能指针托管对象,这首先避免了使用智能指针的意义--

在这种情况下,由于您正在传递本机指针,您可以根据我的规则假设您没有传递所有权,因此无法将其转换为智能指针。

如果将"this“指针包装在正在使用的智能指针中,例如”返回“(CSmartPtr(This);),则可以有效地设置管理同一个对象的多个智能指针,以便第一个引用计数为零的指针将从另一个下销毁该对象。

这显然是非法的,因为您已经说过该对象已经被其他智能指针所拥有。

如果在这些情况下有一个包含(This)值的成员变量返回,则最终将是一个循环引用,从而使引用计数始终为1。。

如果某些外部代码隐式地拥有成员变量,则实际上可以对其进行管理--该代码可以在释放对象之前的某个点调用某种close()方法。显然,经过反思,该外部代码拥有该对象,因此它本身确实应该有一个智能指针。

boost库(我接受您已经说过您没有使用)使这些问题更易于管理,因为它将智能指针库划分为不同类型的所有权(范围、共享、弱等等)。

票数 2
EN

Stack Overflow用户

发布于 2009-09-02 00:10:53

大多数智能指针框架都提供了一种解决这一问题的方法。例如,Boost.SmartPtr提供了一个作为基类使用的enable_shared_from_this<T> CRTP类,然后可以确保共享指针不会导致指向同一个对象的两个指针。

票数 2
EN

Stack Overflow用户

发布于 2009-09-02 07:51:52

解决此问题的一个相当健壮的解决方案是使用侵入式智能指针。要实例化RefCountedPtr<T>,T应该从RefCount派生。这允许从this构造this,因为this->RefCount::m_count持有决定生存期的单个计数器。

缺点:当您将对象放到堆栈上时,您有一个未使用的RefCount。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1365206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档