簡體   English   中英

C ++:我可以在析構函數中安全地使用它嗎?

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

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