gpt4 book ai didi

c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?

转载 作者:IT老高 更新时间:2023-10-28 14:01:19 27 4
gpt4 key购买 nike

我编写了一个静态工厂方法,它返回一个从另一个数据对象填充的新 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();

我的问题分为两部分:

  1. 这种方法是否传达了正确的所有权语义?
  2. 返回 unique_ptr 而不是原始指针是一种“坏习惯”吗?

最佳答案

返回 std::unique_ptr from a factory 方法很好,应该是推荐的做法。它传达的信息是 (IMO):您现在是该对象的唯一所有者。此外,为了您的方便,该对象知道如何销毁自己。

我认为这比返回一个原始指针要好得多(客户端必须记住如何以及是否处理该指针)。

但是,我不明白您关于释放指针以延长其生命周期的评论。一般来说,我很少看到有任何理由调用 release。在智能指针上,因为我认为指针应该始终由某种 RAII 结构管理(我称之为 release 的唯一情况是将指针放在不同的管理数据结构中,例如 unique_ptr 与不同的删除器,在我做了一些保证额外清理的事情之后)。

因此,客户端可以(并且应该)简单地存储 unique_ptr只要他们需要对象(或 unique_ptr ,如果他们需要指针的多个拷贝)的某个地方(例如另一个 shared_ptr ,它是从返回的一个移动构造的)。所以客户端代码应该看起来更像这样:

std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);

我个人也会添加 typedef对于返回的指针类型(在本例中为 std::unique_ptr<Foobar>)和/或使用的删除器(在本例中为 std::default_deleter)到您的工厂对象。如果您稍后决定更改指针的分配,这将变得更容易(因此需要使用不同的方法来销毁指针,这将作为 std::unique_ptr 的第二个模板参数可见)。所以我会做这样的事情:

class Foobar {
public:
typedef std::default_deleter<Foobar> deleter;
typedef std::unique_ptr<Foobar, deleter> unique_ptr;

static unique_ptr factory(DataObject data);
}

Foobar::unique_ptr myFoo = Foobar::factory(data);
//or:
std::shared_ptr<Foobar> myFoo = Foobar::factory(data);

关于c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com