c++ - 是否可以保存对shared_ptr 管理的对象的引用?

标签 c++ shared-ptr smart-pointers

这是我正在做的事情的工作版本。

#include <memory>

using namespace std;

struct thing {
    int blah;
};

struct parentObj {
    parentObj(thing & incomingThing) : isThisOK(incomingThing) {};
    thing & isThisOK;
};

int main()
{
    shared_ptr<thing> thingInstance = make_shared<thing>();
    shared_ptr<parentObj> theObj = make_shared<parentObj>(*thingInstance);
}

我喜欢将共享指针分配给其类型的引用。 (ctrl+f 这样就OK了)

这里会产生意想不到的后果吗?我应该使用弱指针吗?

最佳答案

就像这样:

#include <memory>

using namespace std;

struct thing {
    int blah;
};

struct parentObj {
    parentObj(thing& incomingThing) : isThisOK(incomingThing) {};
    thing& isThisOK;
};

int main()
{
    thing thingInstance;
    shared_ptr<parentObj> theObj = make_shared<parentObj>(thingInstance);
}

就像函数参数默认情况下应该与所有权策略无关(除非需要)一样,我想说你正在做的事情是正确的,甚至在特定情况下推荐它。如果您的对象不知道所有权策略(除非需要),那么这通常是可行的方法。

请注意两件事:

  1. 您必须谨慎对待自己的一生,并在出现 parentObj 时设定界限。应视为无效。
  2. 请注意,当您使用 std::unique_ptr 时,执行类似代码的操作要容易得多。相反,因为唯一指针的所有者更容易跟踪。当阅读带有唯一指针的代码时,您可以轻松地发现生命周期应该在哪里结束以及转移到哪里。与共享的一样,不太清楚。使用唯一的指针,您可以“静态”设置边界,比如说 parentObj thing之后无效死了,应该清楚两人的生命何时结束。如果您有共享指针,我建议您在使用parentObj之前有一种方法在运行时检查有效性。 .

我会使用std::weak_ptr仅当设计为parentObj应检查 thing 的有效性在运行时,以及 parentObj 的用户无法检查 thing 的有效性。通常,代码中有一个地方,当thing时您可以确定。和parentObj开始和结束他们的一生。如果您有一个地方知道它们的生命周期,那么我想说该代码有责任检查 thing 的有效性。和parentObj让这两种类型更简单。

关于c++ - 是否可以保存对shared_ptr 管理的对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66770747/

相关文章:

c++ - 查找函数链以获得所需的输出

c++ - 将 OpenGL 中的 3 层与背景混合

c++ - 为什么 shared_ptr 实现中的 ref_count 是 int*

c++ - 可选成员对象

c++ - 无法从不同的类中检索结构内部的值(返回 0)

c++ - 我什么时候想从原始指针构造一个共享指针

c++ - 在构造函数中(不)做什么

c++ - boost::shared_ptr<T> 和 boost::shared_ptr<const T> 是否共享引用计数?

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

c++ - 管理共享指针 C++