例如,如果我們正在實作智能指標,并且我們想做a = std::move(b)——我們需要洗掉a指向的記憶體,但是我們可以在移動賦值運算子中呼叫解構式,而不是復制粘貼解構式的函式體嗎?
是否定義了在移動賦值中呼叫解構式的行為?
如果不是,有沒有更好的方法來處理它而不是復制粘貼解構式的主體?
uj5u.com熱心網友回復:
您可以在this成員函式內部呼叫解構式,并且它具有明確定義的行為。
但是,該行為涉及結束物件的生命周期*this。在解構式呼叫之后,您不再被允許訪問/使用物件的任何成員。這在許多情況下也會產生不良后果,例如,如果物件具有自動存盤持續時間,則在范圍退出期間將對其第二次呼叫解構式,這將導致未定義的行為。
所以這對你想做的事情沒有用。
盡管我強烈反對它,但理論上您可以通過放置新在同一存盤位置構造一個新物件來遵循解構式呼叫。然而,有一些前提條件超出了類的控制范圍,即何時允許這樣做而不會導致未定義的行為。在某些情況下,這樣的placement-new本身可能是未定義的行為,在某些情況下,如果在placement-new之后使用并且在某些情況下,參考舊物件的名稱/參考/指標不會參考新物件,則會導致未定義的行為作為子物件/成員的任何父物件的生命周期*this也將由此類操作結束,如果之后使用會導致未定義的行為。
您可以在標準(草案)中看到如何根據我的建議和某些(未說明的)假設來實作這一點的演示:https ://timsong-cpp.github.io/cppwp/n4868/basic.life#示例-2
鏈接的示例和它前面的段落并沒有說明我上面暗示的方法的所有條件和可能的問題。只有示例中顯示的類/函式的非常具體的用法是明確允許的。
如果您只想重用代碼,請將解構式的主體移動到一個新的成員函式中,并從需要相同行為的兩個位置呼叫該函式。
uj5u.com熱心網友回復:
顯式呼叫解構式在技術上是可用的,您可以this->~Object()在類的非靜態方法中使用Object。
然而,這是一個不好的做法。考慮改用這些。
class Test {
public:
Test() {}
~Test() {
Deallocate();
}
Test(const Test& other) = delete;
Test(Test&& other) {
Deallocate();
// Do sth
}
private:
void Deallocate() {
// Do sth
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419336.html
標籤:
上一篇:C 如何從類似JSON的文本檔案中獲取特定值?[復制]
下一篇:動態陣列的記憶體地址
