[英]C++: Can I use this safely in a destructor?
今天的問題是:我可以在析構函數中使用this
,如果是,我必須遵守的限制是什么......例如,我知道我不應該對基類做任何事情,因為它們已經消失了。 但是還有其他限制嗎? 我可以安全地假設this
(作為指針...即內存地址......一個數字)與構造函數中的相同嗎?
我可以在析構函數中使用
this
嗎?
是。
例如,我知道我不應該對基類做任何事情,因為它們已經消失了。
不,此時基類仍然完好無損。 派生類的成員(可能還有其他基類)已經被銷毀,但是這個類的成員和基類一直存在,直到析構函數完成之后。
但是還有其他限制嗎?
根據當前被銷毀的類調度虛函數,而不是前一個派生類。 所以要小心調用它們,特別是不要在這個類中調用任何純虛函數。
不要投this
一個派生類型,因為它不再是該類型的有效對象。
出於顯而易見的原因,您無法從析構函數中delete this
。
我可以安全地假設這個(作為指針...即內存地址......一個數字)與構造函數中的相同嗎?
是的,對象的地址在其構造函數運行之前保持不變,直到其析構函數運行之后。
析構函數中沒有基類,您可以正常使用它們。
派生類已經消失,因此特別是虛擬調用將無法到達派生類。
this
與構造函數和類中的其他位置具有相同的值。
主要限制是您不應允許任何異常離開析構函數。 這意味着您無法指示失敗[*]。 通常,您應該只執行確定成功的操作(例如釋放對象擁有的資源):您執行的任何操作都可能失敗,忽略失敗必須是可以的。 你做的任何東西都可以拋出,你應該抓住異常。 希望你已經完全記錄了所有的功能引發的可能的例外this
,所以你知道你是否希望與做的事情this
可以拋出。
[*]好吧,你可以為析構函數構建一個機制來記錄發生的事情,但是類的用戶必須主動檢查它。 這不太可能帶來愉快的用戶體驗。
我沒有看到在析構函數中使用this
任何問題。 此時,物體仍在那里。 析構函數用於在銷毀對象之前釋放現有資源。
但是避免調用虛函數。
是的你可以正常使用它。 你有那個對象。
析構函數是一種方法, 在對象被物理破壞之前調用,以便您可以正確地對其進行初始化。 為此,您必須有權訪問其字段,以便您可以通過this關鍵字安全地訪問它們。
析構函數的順序與構造函數相反,因此當析構函數運行時,基類的析構函數尚未運行 - 您應該可以訪問其所有字段。 另一方面,派生類的析構函數已經運行,因此 - 例如 - 調用虛方法或抽象方法可能會導致未定義的行為。
另外,請記住, 在析構函數中拋出異常是非常危險的。 如果您這樣做,則可能會終止您的申請。
由於對象是從最派生類到基礎的,所以派生類析構函數已經執行了。 所以,你必須確保不叫在派生類中重寫方法上this
。 除此之外,沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.