簡體   English   中英

銷毀靜態存儲持續時間對象和未定義的行為

[英]destruction of static storage duration objects & undefined behavior

C ++標准第3.6.1節指出

調用在<cstdlib>聲明的函數std::exit(int)終止程序,而不會離開當前塊,因此不會破壞具有自動存儲時間的任何對象。如果在破壞對象期間調用std :: exit來結束程序,具有靜態存儲期限,該程序具有未定義的行為。

因此,請考慮遵循以下簡單程序

#include <iostream>
#include <cstdlib>
class test
{
    public:
        test()
        {
            std::cout<<"constructor\n";
        }
        ~test()
        {
            std::cout<<"destructor\n";
        }
};
int main()
{
    test t;
    exit(0);
}

上面程序的輸出應該很明顯

構造函數

所以,我的問題是:

  1. 什么時候自動物體t會被破壞?

  2. 它會被編譯器安全地銷毀嗎?

  3. 為什么它是未定義的行為?

現在,考慮上述程序的稍作修改的版本。

#include <iostream>
#include <cstdlib>
class test
{
    public:
        test()
        {
            std::cout<<"constructor\n";
        }
        ~test()
        {
            std::cout<<"destructor\n";
        }
};
int main()
{
    static test t;
    exit(0);
}

現在,我得到以下輸出:

構造函數

析構函數

因此,由於未定義的行為,是否有可能僅將構造函數調用作為某些C ++實現的輸出?

如果我理解不正確,請指正。

  1. 什么時候自動物體t會被破壞?

決不。 您引用的引言是“ ... 不會破壞具有自動存儲期限的任何對象...”

  1. 它會被編譯器安全地銷毀嗎?

不會。編譯器的工作是為機器生成要運行的代碼,一旦在運行時,編譯器就不再執行任何操作。

  1. 為什么它是未定義的行為?

在您的示例中,這不是未定義的行為-您不是在“銷毀具有靜態或線程存儲持續時間的對象期間,調用std::exit() ”。 但是,如果您願意的話,回答“這是未定義的行為就足夠了,因為標准明確指出了這一點”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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