11
我想知道在atexit()
中註冊的函數在全局變量銷燬之前或之後被調用。這是由標準還是實施定義的?何時用atexit()註冊的函數調用
我想知道在atexit()
中註冊的函數在全局變量銷燬之前或之後被調用。這是由標準還是實施定義的?何時用atexit()註冊的函數調用
據良好定義的,並且取決於所討論的對象是否是之前或功能得到使用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()
被調用後也被打爛,反之亦然。我確信有微妙之處,但這似乎是基本原則。
基本上,是的。標準中的措辭比較複雜,因爲在多線程程序中,「之前」和「之後」的定義比較棘手,並不總是像你期望的那樣行事。 – aschepler
注意'構造'意味着*構造函數結束*,我們只考慮完整的對象,而不是基礎或屬性。 –