【发布时间】:2014-01-21 11:09:53
【问题描述】:
我已经远离严肃的 C++ 大约十年了。我又回来了,目前正在开展一个项目以完全熟悉 C++11。关于如何最好地通过 std::shared_ptr,我遇到了一些生存危机。
举个简单的例子,采用以下设置:
class ServiceB {
public:
ServiceB() {}
};
class ServiceA {
public:
ServiceA(std::shared_ptr<ServiceB>& serviceB)
: _serviceB(serviceB) {
}
private:
std::shared_ptr<ServiceB> _serviceB;
};
class Root {
public:
Root()
: _serviceB(std::shared_ptr<ServiceB>(new ServiceB())),
_serviceA(std::unique_ptr<ServiceA>(new ServiceA(_serviceB))) {
}
private:
std::shared_ptr<ServiceB> _serviceB;
std::unique_ptr<ServiceA> _serviceA;
};
请注意,ServiceA 需要对 ServiceB 的引用。我想将该引用保留在 shared_ptr 中。我可以做我在这里所做的事情吗,这只是将 shared_ptr 作为参考传递下来,让 std::shared_ptr 复制构造函数为我完成工作?这是否正确地增加了 shared_ptr 上的引用计数?
如果这不是最好的方法,那么传递 std::shared_ptr 的常见“最佳实践”是什么?
【问题讨论】:
-
看看Guru of the Week #91,这正是这个主题。
-
C++11 的经验法则“如果你要复制,就按值传递”适用于
shared_ptr和其他所有类型一样。 -
也使用 make_shared 而不是手动构建 shared_ptr。它为您节省了一次分配并防止在某些情况下发生内存泄漏。 en.cppreference.com/w/cpp/memory/shared_ptr/make_shared
-
@aryjczyk 我终于花时间查看 make_shared/make_unique 的实际工作原理,感谢您的提示。我试图像“std::make_shared
(existingPtr)”一样使用它们,而不是意识到它们实际上是使用一些模板魔术构造我的对象。我仍然有一种情况我必须做 std::unique_ptr 因为我有一个现有的要包装的指针,但是我在其他任何地方都使用 make_shared/make_unique。