簡體   English   中英

從全局對象的構造函數調用時的std :: atexit排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM