cppcoreguidelines R.33为什么通过引用传递' unique_ptr ' ?



cppcoreguidelines规则R.33建议

unique_ptr<widget>&参数表示该函数重置小部件。

Reason以这种方式使用unique_ptr既记录又强制函数调用的重排序语义。

注"reseat"的意思是"使指针或智能指针指向a"不同的物体。">

我不明白,当reseat意味着"使指针或智能指针指向不同的对象"时,我们为什么要通过引用传递。

当函数的目的是重新定位/改变指针指向的底层对象时,我们不是从调用者那里窃取了所有权吗?因此应该通过值传递unique_ptr,从而移动它并转移所有权?

是否有一个例子解释为什么推荐通过引用传递unique_ptr?

当函数的目的是重置/更改指针所指向的底层对象时,我们不是从调用者那里窃取了所有权吗

。当我们"休息"时也不会。对于指针,也不是当我们改变指向对象时,我们获得指针的所有权,也就是说,我们没有转移指针的所有权。

是否有一个例子来解释为什么通过引用传递unique_ptr是推荐的?

下面是一个函数的例子:惟一指针:

void reseat(std::unique_ptr<widget>& ptr) {
ptr = std::make_unique<widget>();
}

如果试图使用const的引用,则根本无法编译。如果您尝试使用非引用形参,那么实参指针就不会被修改,因此行为就不会像期望的那样。调用者将被迫移动指针,使其始终为空。

您可以修改示例以使用指向唯一指针的指针,但建议使用引用,因为不可能错误地传递null。引用包装器也可以工作,但它会不必要地复杂。

如果我们让它指向别的地方,它之前指向的对象会发生什么?

如果一个唯一指针指向的不是null,那么使它指向其他地方将导致先前指向的对象被删除。

在这种情况下我们不是在泄漏内存吗?


注意,为了便于理解,示例很简单。通常我不建议编写这样的函数,而是考虑编写一个返回新的唯一指针的函数,并让调用者"休息"。指针本身。但这取决于细节。

相关内容

  • 没有找到相关文章

最新更新