gpt4 book ai didi

c++ - "this"指针和智能指针应该混合使用吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:22 26 4
gpt4 key购买 nike

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

我假设将两者结合起来是不行的,因为两者之一:

  1. 您正在将 native 指针传递给智能指针管理的对象,这首先违背了使用智能指针的意义,
  2. 如果在使用时将“this”指针包装在智能指针中,例如“return CSmartPtr(this);”,你已经有效地设置了多个智能指针来管理同一个对象,所以第一个引用计数为零的智能指针将从另一个下面销毁该对象,或者
  3. 如果您有一个成员变量保存 CSmartPtr(this) 的值以在这些情况下返回,它最终将是一个循环引用,导致引用计数始终为 1。

为了提供一些上下文,我最近了解了将 STL 容器与对象组合的负面影响(重复浅复制、使用基类容器时的切片等),所以我将这些用法替换为我的代码带有指向对象的智能指针。一些对象使用“this”指针传递对自身的引用,这就是我遇到的问题。

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

编辑:我一直在做的一个(非常人为的)例子是

...::AddToProcessingList(vector<CSmartPtr> &vecPtrs)
{
vecPtrs.push_back(CSmartPtr(this));
}

最佳答案

可以将两者结合起来,但您始终需要清楚地了解所有权问题。通常,我遵循的规则是永远不要将原始指针转换为智能指针(具有所有权),除非您确定此时您正在取得该对象的所有权。这样做是安全的时间应该是显而易见的,但包括以下内容:

  1. 您刚刚创建了对象(通过 new)
  2. 您从某个外部方法调用传递了对象,其中语义显然是所有权之一(例如 add 到容器类)
  3. 对象正在传递给另一个线程

只要您遵守规则,并且没有任何所有权不明确的情况,就不会出现问题。

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

  1. 您正在将 native 指针传递给智能指针管理的对象,这首先违背了使用智能指针的意义

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

  1. 如果在使用时将“this”指针包装在智能指针中,例如“return CSmartPtr(this);”,你已经有效地设置了多个智能指针来管理同一个对象,所以第一个引用计数为零的智能指针将从另一个下面销毁该对象

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

  1. 如果您有一个成员变量保存 CSmartPtr(this) 的值以在这些情况下返回,它最终将是一个循环引用,导致引用计数始终为 1。

这实际上是可以管理的,如果一些外部代码隐含地拥有成员变量——这段代码可以在释放对象之前的某个时刻调用某种close() 方法。显然,经过反射(reflection),外部代码拥有该对象,因此它本身确实应该有一个智能指针。

boost 库(我接受你说过你没有使用)使这类问题更容易管理,因为它根据不同类型的所有权(作用域、共享、弱等)划分了智能指针库).

关于c++ - "this"指针和智能指针应该混合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com