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,那么使它指向其他地方将导致先前指向的对象被删除。
在这种情况下我们不是在泄漏内存吗?
号
注意,为了便于理解,示例很简单。通常我不建议编写这样的函数,而是考虑编写一个返回新的唯一指针的函数,并让调用者"休息"。指针本身。但这取决于细节。