我正在追蹤構造函數及其析構的實例,爲此我計劃在構造函數和析構函數中記錄「this」的值。我不知道在構造函數中記錄「this」的值是否安全。如果它不安全,那麼我不想知道它會失敗的場景?是否安全的記錄這在構造函數中的值
回答
如果通過「日誌記錄」的意思是「將值寫爲例如十六進制地址到日誌文件」,那麼它很好,很安全。如果沒有,請澄清。
在構造函數調用完成之前對象沒有完全構造。因此在此之前(即從構造函數中)將this
發佈到程序的其餘部分是不安全的。因爲這可能導致有人試圖實際使用半結構對象。這可能會導致微妙而難以發現的錯誤。
發佈this
可以意味着下列情況之一:
- 傳遞作爲參數的外部(非成員)函數,
- 其存儲在提供給其他對象的數據結構,
- (爲了完整起見:從函數調用返回它 - 這不適用於此特定情況,因爲您不能從構造函數返回任何東西)。
寫出的this
到一個文件中的地址,因此不會發布到你的程序*的其餘部分,因此應該罰款。
* ,除非你做一些很神祕的東西之後,好像在不同的線程/進程加載回從該文件的地址和鑄造回一個對象指針......這已經足夠不安全本身: - )
爲什麼你認爲這不安全?事實上,只要這些對象是有效的,就記錄任何對象的地址也不例外。
它的長短之處在於它在您打算使用它的場景中是安全的。
由於該對象沒有完全構建。所以,我認爲它不安全,它可能會扔垃圾? – 2012-04-21 08:15:43
如果您到達構造函數階段,構造對象,它的成員可能不會取決於您如何初始化您的成員,即初始化列表與一些initialise()函數,因此您的成員可能有垃圾值,但類對象將是有效的 – EdChum 2012-04-21 08:17:58
所以,我用來記錄這個跟蹤構造函數和析構函數的情況,是安全的,我也在構造函數中記錄調用堆棧。我認爲這是跟蹤程序中非破壞序列的好方法,也很容易發現內存泄漏。 – 2012-04-21 08:23:16
先分配內存,然後設置this
,然後調用構造函數。所以你可以在構造函數中使用this
,因爲它指向正確的位置 - 構造不會改變this
。然而,如果構造失敗(拋出),內存將消失,並且this
指向的值將是垃圾,因此您不應將其存儲並用於構造函數外的任何內容,直到您知道構造將成功爲止。
- 1. 同步Set線程的構造函數 - 副本是否安全?
- 2. 安全__attribute __((構造函數))函數類
- 3. 這些構造函數是否正確?
- 4. 在C++的函數參數中使用構造函數是安全的嗎?
- 5. String類的構造函數安全
- 6. 通過字節數組構造虛擬函數的結構是否安全?
- 7. 適用於記錄的構造函數
- 8. 從GET構造DateTime()是否安全?
- 9. 在C#中,從構造函數調用虛方法是否安全?
- 10. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 11. 用無參數構造函數記錄?
- 12. 指向調用類的構造函數的資源是否安全?
- 13. 在已發佈的結構(在memcpy中使用)中添加構造函數是否安全?
- 14. 構造函數的速記
- 15. 如何在jsdoc中記錄函數和函數構造函數的屬性?
- 16. .NET中的這個函數是否安全共享?
- 17. 依靠隱式聲明的移動構造函數是否安全?
- 18. 在析構函數中發出sigC++信號是否安全?
- 19. 如何在構造函數外訪問構造函數的值
- 20. 檢查構造函數是否在ES6中繼承另一個構造函數
- 21. Java反射中的構造函數類的線程安全
- 22. 在Scala構造函數中是否有本地值/變量?
- 23. 構造函數在JavaScript中的構造?
- 24. C++是否在這裏調用複製構造函數?
- 25. 什麼類型的java構造函數是這些?構造函數鏈接?
- 26. Codeigniter的構造函數 - 檢查用戶是否登錄
- 27. 值構造函數中的字面值
- 28. 我的所有參數是否應該在構造函數中?
- 29. 在構造函數中拋出的異常:析構函數是否被調用?
- 30. Python 3的input()函數是否安全?
是的我只是想將這個值保存在日誌文件中,並且每當調用該實例的析構函數時,我都會記錄該值。我正在這樣做,以確定析構函數沒有被調用的那些實例(this)。在保存構造函數中的值的同時,我正在做的另一件事是,我將調用堆棧保存在日誌文件中。在調用堆棧的幫助下,我可以很容易地知道哪個調用堆棧實例沒有被破壞。 – 2012-04-21 08:13:14
我也向同事問過同樣的問題,他們說它在構造函數中記錄這個值並不安全,因爲那時對象沒有完全構造。請清除我的疑問,並讓我知道它會失敗的場景 – 2012-04-21 08:14:40
否否我不會在程序中再次加載此值。我已經向你解釋了我正在使用的這個場景。我只想跟蹤未被破壞的實例。 – 2012-04-21 08:18:34