我的问题围绕着我是否必须从我的界面公开我对 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/