![](/img/trans.png)
[英]What is the difference between std::move and unique_ptr::release?
[英]std::unique_ptr::release() vs std::move()
我有一個表示運行時上下文並構建樹的類,樹根保存在unique_ptr
。 在構建樹時,我想要提取樹。 這是它的外觀(不可運行,這不是一個調試問題):
class Context {
private:
std::unique_ptr<Node> root{new Node{}};
public:
// imagine a constructor, attributes and methods to build a tree
std::unique_ptr<Node> extractTree() {
return std::move(this->root);
}
};
所以我使用std::move()
從Context
實例中提取根節點。
但是有使用std::move()
替代方法,例如:
std::unique_ptr<Node> extractTree() {
// This seems less intuitive to me
return std::unique_ptr<Node>{this->root.release()};
}
std::move()
是最好的選擇嗎?
你肯定應該使用第一個版本,因為第二個版本基本上完成了第一個版本所做的一切,代碼更多,可讀性更低。
從哲學上講,第二個版本移動了唯一的指針,不多也不少。 那么為什么繞過桌子而不是使用已經存在的,更具可讀性和更具慣用性的std::unique_ptr(std::unique_ptr&&)
?
最后,如果您將來某處的智能指針將保留自定義刪除器 ,則第一個版本將確保刪除器也會移動,第二個版本不會移動刪除器。 我可以想象一個程序員使用release
構建自定義刪除器unique_pointer之外的非自定義刪除器唯一指針。 使用移動語義,程序將無法編譯。
你在做什么是危險的。 一旦調用了getTree()
,就不能再次調用它,這在界面上並不清楚。 您可能想重新考慮您的設計(例如,shared_ptr可能會做得更好,或者只是將根存儲為原始指針並手動處理釋放)。
無論如何,使用std::move
是兩者中更好的選擇,如果你想堅持你的設計,因為它會使你的意圖更清晰。
編輯:顯然'絕不'具有英語禁止的特殊含義我不知道。 可以根據需要調用函數兩次或多次,但如果連續完成,則不會返回指向有效對象的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.