我编写了一个静态工厂方法,该方法返回一个新的Foobar对象,并从另一个数据对象中填充。最近,我对所有权语义变得着迷,想知道通过使这个工厂方法返回一个 unique_ptr
是否传达了正确的信息。
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
我的意图是告诉客户端代码他们拥有指针。如果没有智能指针,我会简单地返回 Foobar*
。然而,为了避免潜在的错误,我希望强制删除这个内存,所以 unique_ptr
似乎是一个合适的解决方案。如果客户端想要延长指针的生命周期,他们只需要在获取 unique_ptr
后调用 .release()
。
Foobar* myFoo = Foobar::factory(data).release();
我的问题分为两个部分:
- 这种方法是否表达了正确的所有权语义?
- 返回
unique_ptr
而不是裸指针是一种“不良做法”吗?