CppCoreGuidelines R33 为什么通过引用传递 `unique_ptr`?
CppCoreGuidlines R.33 Why pass `unique_ptr` by reference?
Take a unique_ptr<widget>&
parameter to express that a function
reseats the widget.
Reason Using unique_ptr
in this way both documents and enforces the
function call’s reseating semantics.
Note “reseat” means “making a pointer or a smart pointer refer to a
different object.”
我不明白当reseat意味着“使指针或智能指针引用不同的对象时,为什么我们应该通过引用传递。”
当函数的目的是 reseat/change 指针指向的底层对象时,我们不是以这种方式从调用者那里窃取所有权,因此应该按值传递 unique_ptr
,因此移动它并转移所有权?
是否有示例可以解释为什么建议通过引用传递 unique_ptr
?
When the function's purpose is to reseat/change the underlying object the pointer is pointing to, aren't we stealing the ownership from the caller this way
没有。无论是当我们“重新设置”一个指针时,还是当我们更改指向的对象时,我们都没有获得指针的所有权,即我们没有转移所有权。
Is there an example that explains why passing a unique_ptr by reference is recommended?
下面是一个“重置”唯一指针的函数示例:
void reseat(std::unique_ptr<widget>& ptr) {
ptr = std::make_unique<widget>();
}
如果您尝试使用对 const 的引用,那将根本无法编译。如果您尝试使用非引用参数,则参数指针不会被修改,因此行为不会如您所愿。调用者将被迫移动他们的指针,使其始终为空。
您可以修改示例以使用指向唯一指针的指针,但建议使用引用,因为不可能错误地传递 null。参考包装器也可以工作,但它会不必要地复杂。
In case we make it point somewhere else, what happens to the object it pointed before?
如果唯一指针指向非空的对象,那么将其指向其他地方将导致删除先前指向的对象。
Aren't we leaking memory in this case?
没有
注意,为了便于理解,示例比较简单。通常我不建议编写这样的函数,而是考虑编写一个 returns 新的唯一指针的函数,并让调用者自己“重新设置”指针。但这要看细节。
Take a
unique_ptr<widget>&
parameter to express that a function reseats the widget.Reason Using
unique_ptr
in this way both documents and enforces the function call’s reseating semantics.Note “reseat” means “making a pointer or a smart pointer refer to a different object.”
我不明白当reseat意味着“使指针或智能指针引用不同的对象时,为什么我们应该通过引用传递。”
当函数的目的是 reseat/change 指针指向的底层对象时,我们不是以这种方式从调用者那里窃取所有权,因此应该按值传递 unique_ptr
,因此移动它并转移所有权?
是否有示例可以解释为什么建议通过引用传递 unique_ptr
?
When the function's purpose is to reseat/change the underlying object the pointer is pointing to, aren't we stealing the ownership from the caller this way
没有。无论是当我们“重新设置”一个指针时,还是当我们更改指向的对象时,我们都没有获得指针的所有权,即我们没有转移所有权。
Is there an example that explains why passing a unique_ptr by reference is recommended?
下面是一个“重置”唯一指针的函数示例:
void reseat(std::unique_ptr<widget>& ptr) {
ptr = std::make_unique<widget>();
}
如果您尝试使用对 const 的引用,那将根本无法编译。如果您尝试使用非引用参数,则参数指针不会被修改,因此行为不会如您所愿。调用者将被迫移动他们的指针,使其始终为空。
您可以修改示例以使用指向唯一指针的指针,但建议使用引用,因为不可能错误地传递 null。参考包装器也可以工作,但它会不必要地复杂。
In case we make it point somewhere else, what happens to the object it pointed before?
如果唯一指针指向非空的对象,那么将其指向其他地方将导致删除先前指向的对象。
Aren't we leaking memory in this case?
没有
注意,为了便于理解,示例比较简单。通常我不建议编写这样的函数,而是考虑编写一个 returns 新的唯一指针的函数,并让调用者自己“重新设置”指针。但这要看细节。