2012-04-21 37 views
1

我正在追蹤構造函數及其析構的實例,爲此我計劃在構造函數和析構函數中記錄「this」的值。我不知道在構造函數中記錄「this」的值是否安全。如果它不安全,那麼我不想知道它會失敗的場景?是否安全的記錄這在構造函數中的值

回答

8

如果通過「日誌記錄」的意思是「將值寫爲例如十六進制地址到日誌文件」,那麼它很好,很安全。如果沒有,請澄清。

在構造函數調用完成之前對象沒有完全構造。因此在此之前(即從構造函數中)將this發佈到程序的其餘部分是不安全的。因爲這可能導致有人試圖實際使用半結構對象。這可能會導致微妙而難以發現的錯誤。

發佈this可以意味着下列情況之一:

  • 傳遞作爲參數的外部(非成員)函數,
  • 其存儲在提供給其他對象的數據結構,
  • (爲了完整起見:從函數調用返回它 - 這不適用於此特定情況,因爲您不能從構造函數返回任何東西)。

寫出的this到一個文件中的地址,因此不會發布到你的程序*的其餘部分,因此應該罰款。

* ,除非你做一些很神祕的東西之後,好像在不同的線程/進程加載回從該文件的地址和鑄造回一個對象指針......這已經足夠不安全本身: - )

+0

是的我只是想將這個值保存在日誌文件中,並且每當調用該實例的析構函數時,我都會記錄該值。我正在這樣做,以確定析構函數沒有被調用的那些實例(this)。在保存構造函數中的值的同時,我正在做的另一件事是,我將調用堆棧保存在日誌文件中。在調用堆棧的幫助下,我可以很容易地知道哪個調用堆棧實例沒有被破壞。 – 2012-04-21 08:13:14

+0

我也向同事問過同樣的問題,他們說它在構造函數中記錄這個值並不安全,因爲那時對象沒有完全構造。請清除我的疑問,並讓我知道它會失敗的場景 – 2012-04-21 08:14:40

+0

否否我不會在程序中再次加載此值。我已經向你解釋了我正在使用的這個場景。我只想跟蹤未被破壞的實例。 – 2012-04-21 08:18:34

0

爲什麼你認爲這不安全?事實上,只要這些對象是有效的,就記錄任何對象的地址也不例外。

它的長短之處在於它在您打算使用它的場景中是安全的。

+0

由於該對象沒有完全構建。所以,我認爲它不安全,它可能會扔垃圾? – 2012-04-21 08:15:43

+0

如果您到達構造函數階段,構造對象,它的成員可能不會取決於您如何初始化您的成員,即初始化列表與一些initialise()函數,因此您的成員可能有垃圾值,但類對象將是有效的 – EdChum 2012-04-21 08:17:58

+0

所以,我用來記錄這個跟蹤構造函數和析構函數的情況,是安全的,我也在構造函數中記錄調用堆棧。我認爲這是跟蹤程序中非破壞序列的好方法,也很容易發現內存泄漏。 – 2012-04-21 08:23:16

0

先分配內存,然後設置this,然後調用構造函數。所以你可以在構造函數中使用this,因爲它指向正確的位置 - 構造不會改變this。然而,如果構造失敗(拋出),內存將消失,並且this指向的值將是垃圾,因此您不應將其存儲並用於構造函數外的任何內容,直到您知道構造將成功爲止。

相關問題