在我的类中构造函数是私有的,我添加了一个静态方法“CreateMyClassPtr”,它使用构造函数并返回它的share_ptr。
这是正确的实施吗?
您认为我甚至必须确保使用shared_ptr
吗?我可以留给用户决定吗?
答案 0 :(得分:3)
如果您没有持有它的任何副本,但是您希望用户使用delete
删除指向对象,那么您可以按值返回std::auto_ptr
。它不添加任何依赖项(auto_ptr
是标准的一部分),它使您的界面清楚地传达对象需要delete
d。
如果用户愿意,那么他们可以release
指针并手动执行操作或将其移动到共享智能指针框架中。
答案 1 :(得分:2)
该元素是否真的共享?也就是说,在创建之后,为了您自己的目的,您是否保留指向对象的指针,或者您这样做是为了避免用户内存泄漏?
如果内存实际上没有共享,我就不会使用shared_ptr
。请注意,通过使用shared_ptr
作为返回类型,您强制使用动态分配和智能指针的特定实现,但是限制了堆栈对您的类型和其他可能更多的智能指针类型的使用适当的(你不能从共享指针中提取成员资格)
如果你真的想确保呼叫不会泄漏(也就是说,如果用户调用你的函数,返回的内存将以某种方式处理),你可以使用std::auto_ptr
或boost::unique_ptr
(即使在C ++ 0x中,最后一个也是不标准的。)两种解决方案都允许调用代码从智能指针中提取指针,并使用不同的方法进行内存管理(即使在某些情况下它很麻烦)。
struct type {
std::auto_ptr<type> create();
};
std::auto_ptr<type> ap = type::create();
std::shared_ptr<type> sp( type::create().release() );
type::create(); // will not leak memory
type *rp = type::create().release(); // user specifically requested a raw pointer!
答案 2 :(得分:1)
这会奏效,是的。但是,你确定需要吗?在某些情况下这是合适的,但是当你这样做时,你确实限制了你的选择。用户可能想要使用其他形式的智能指针,更不用说当你以这种方式隐藏构造函数时,你正在消除基于堆栈的分配。
答案 3 :(得分:0)
如果要将类暴露给客户端,请不要强制它们使用共享指针。他们知道他们创建了一个对象,他们负责删除它。
然后他们可以轻松写出
myfavorite::api::shared_ptr<Class> object(Class::create());
或
std::auto_ptr<Class> object(Class::create());