c++ - 适合构图的智能指针

标签 c++ inheritance smart-pointers

我有一个类的继承结构:

struct A {
    ObjectByValue obv;
};

struct B : A {
    OtherThings ot;
};

另一个类需要一个指向A的指针:

struct C {
    smartpointer<A> a;
};

当我创建C时,我传入一个已经创建的B(作为指向A的指针)。 C 不拥有 A(并且没有 AC 没有任何意义)。 C 将(希望)总是在 A 指针被释放之前消亡。我应该使用智能指针吗?引用?原始指针?这里有最佳实践吗?

最佳答案

答案很大程度上取决于什么拥有 A实例。

  • 如果“没有人”拥有 A实例,那么它必须是全局的或静态分配的。在这种情况下,您应该使用普通引用 ( A& )。这也断言该对象永远不能为空(即它在 C 的生命周期内始终存在)。

否则,该对象将被动态分配:

  • 如果其他对象拥有 A实例,并且可以证明比 C 更长寿,那么情况与静态分配的情况非常相似。所有者应该有一个 unique_ptr<A> ,和C可以有一个简单的引用。
  • 如果其他对象拥有 A实例,但可能会或可能不会比 C 更长久,那么所有者应该使用 shared_ptr<A>C应该使用weak_ptr<A> 。如果所有者在C之前被删除是,那么weak_ptr将自动变为 null。
  • 所有权是否应在 C 之间共享实例和其他所有者,那么您应该使用 shared_ptr<A>在这两个地方。然后,C实例保证其 A成员始终有效,并且共享所有权(从某种意义上说,必须先删除所有所有者,然后才能删除 A)。

关于c++ - 适合构图的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28595337/

相关文章:

java - 从指向专用类型实例的类类型变量进行部分访问

c++ - 是什么导致构造函数后出现这些 'unexpected tokens' 错误?

Java接口(interface)查询

c++ - 为什么要在 C++ 中将智能指针作为函数参数传递?

c++ - 隐式与显式默认构造函数调用

c++ - 如何检查发生运行时错误之前执行的.cpp文件的最后一行?

c++ - 堆栈溢出与 std::make_unique 但不是与原始指针

c++ - 如何在 C++ 中返回唯一所有权

c++ - Vector of Vector of (member) 函数指针

c++ - 结构中的可变长度字符串和导致时间旅行的未定义行为