c++ - 关于 boost::shared_ptr 的困惑

标签 c++ pointers reference shared-ptr

我的问题围绕着我是否必须从我的界面公开我对 boost::shared_ptr 的使用,以及我是否应该从我的界面公开原始指针或引用。

考虑一个的情况,他有一个雇主Employee 在内部维护其所有员工在 vector< shared_ptr< Person > > 中.因此,最佳实践是否规定任何涉及 Person 的接口(interface)都应该是一个 shared_ptr 包装的人?

例如,是否全部或仅其中一些可以:

Person Employeer::getPresidentCopy();
Person& Employeer::getPresidentRef();
Person* Employeer::getPresidentRawPtr();
shared_ptr<Person> Employeer::getPresidentSharedPtr();

或者例如:

void Employeer::hireByCopy(Person p);
void Employeer::hireByRef(Person& p);
void Employeer::hireByRawPtr(Person* p);
void Employeer::hireBySharedPtr(shared_ptr<Person> p);

如果我以后想更改实现以使用 johns_very_own_shared_ptr 而不是 boost 品种,我是否陷入了旧实现?

另一方面,如果我从接口(interface)公开原始指针或引用,我是否会冒有人从 shared_ptr 下删除内存的风险?还是我冒着删除 shared_ptr 并使我的引用无效的风险?


查看我的 new question举个例子。

最佳答案

For example, are all or only some of these ok:

这取决于您要实现的目标。为什么 vector 保存 shared_ptr 而不是直接按值存储 Person? (您是否考虑过 boost::ptr_vector?)

您还应该考虑,也许您真正应该分发的是 weak_ptr

If I later want to change the implementation to use johns_very_own_shared_ptr instead of the boost variety, am I trapped in the old implementation?

差不多,但也不是不可能修复。 (我怀疑在 C++0x 中,自由使用 auto 关键字会使这更容易处理,因为你不必修改调用代码,即使它没有'不要使用 typedef s。)但是,你为什么要想要那样做呢?

On the other hand, if I expose raw pointers or references from the interface, do I risk someone deleting the memory out from under the shared_ptr?

是的,但这不是你的问题。人们也可以从 shared_ptr 中提取原始指针并删除它。但是如果你想避免让事情变得不必要的不​​安全,不要在这里返回原始指针。引用要好得多,因为没有人认为它们应该 delete &reference_received_from_api;。 (无论如何,我希望如此 ^^;;;;)

关于c++ - 关于 boost::shared_ptr 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389650/

相关文章:

c++ - 运行小程序时Windows编译报错

c++ - 通过引用传递 c++ 与命名空间中的类

c++ - 初始化引用时,何时以及为何获得拷贝?

c++ - 小于重载 C++

c++ - 如何扫描文件夹中的所有文件,包括 VC++ 2008 中的子文件夹?

C++:使用 void 作为模板参数

c - c中的静态矩阵乘法到动态矩阵

c++ - 验证取自 std::cin 的 char * 的长度

pointers - 二叉树的实现可能会出现哪些问题?

C++ 将 'main' 声明为对函数的引用?