簡體   English   中英

std :: unique_ptr :: release()vs std :: move()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM