![](/img/trans.png)
[英]std::ofstream not creating file when called from constructor from global object
[英]std::atexit ordering when called from a global object's constructor
cppreference說關於std::atexit
:
這些函數可以與具有靜態存儲持續時間的對象的銷毀同時被調用,並且保持如果在B的注冊之前如果A的注冊被排序,則在調用之前對B的調用進行排序的保證。 A,同樣適用於靜態對象構造函數和對atexit的調用之間的順序
我理解這段話意味着,如果在靜態初始化期間調用std::atexit
,則在破壞靜態對象時會調用注冊函數,而靜態對象是在std::atexit
時最后初始化的靜態對象。注冊函數被調用。 我還解釋“可以同時調用”意味着調用可以發生在靜態對象析構之間,而不是對單詞的多線程解釋。
我想知道的是,當初始化開始或完成時,對象是否被視為已初始化(在此排序的上下文中)。 我寫了一個簡短的測試來測試這個:
#include <cstdlib>
#include <iostream>
struct foo
{
foo()
{
std::cout << "ctor\n";
std::atexit([]() { std::cout << "atexit\n"; });
}
~foo()
{
std::cout << "dtor\n";
}
};
foo my_foo;
int main()
{
return 0;
}
我得到的輸出是( http://cpp.sh/3bllu ):
ctor
dtor
atexit
這使我相信在構造完成之前, my_foo
不會被認為是在此上下文中初始化的。 換句話說,該功能被認為之前已經注冊my_foo
被初始化,所以注冊的函數后,執行my_foo
的破壞。
我似乎找不到任何可以保證這種行為的東西,我甚至不完全確定我對引用段落的初步解釋是正確的。 我描述的行為是我可以依賴的,還是實現定義甚至未定義的行為?
對函數的調用將在調用傳遞給atexit
的函數之前發生。 從[basic.start.term],p5:
如果在具有靜態存儲持續時間的對象初始化完成之前強烈發生對
std::atexit
的調用,則在調用傳遞給std::atexit
的函數之前,對對象的析構函數的調用將被排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.