2012-11-27 22 views

回答

20

據良好定義的,並且取決於所討論的對象是否是之前或功能得到使用atexit()註冊之後建造:

3.6.3終止

3.如果在調用std::atexit(參見<cstdlib>,18.5)之前完成具有靜態存儲持續時間的對象的初始化的排序已完成,則調用傳遞給std::atexit的函數的調用將在c所有這些都是對象的析構函數。如果在完成具有靜態存儲持續時間的對象的初始化之前對std::atexit的調用進行排序,則在對該函數的調用傳遞給std::atexit之前,對該對象的析構函數的調用被排序。如果在std::atexit的另一個呼叫之前對std::atexit的呼叫進行排序,則在調用傳遞給第一個std::atexit呼叫的功能之前,對傳遞給第二個std::atexit呼叫的功能的呼叫進行排序。上述

我外行的解釋是東西,得到了以前建造你叫atexit(handler)handler()被調用後也被打爛,反之亦然。我確信有微妙之處,但這似乎是基本原則。

+4

基本上,是的。標準中的措辭比較複雜,因爲在多線程程序中,「之前」和「之後」的定義比較棘手,並不總是像你期望的那樣行事。 – aschepler

+1

注意'構造'意味着*構造函數結束*,我們只考慮完整的對象,而不是基礎或屬性。 –

相關問題