2

我剛剛寫了下面的程序&它編譯&運行正常。 (見現場演示here.析構函數調用標量類型和未定義的行爲

#include <iostream> 
typedef int T; 
int main() 
{ 
    int a=3; 
    std::cout<<a<<'\n'; 
    a.~T(); 
    std::cout<<a; 
    return 0; 
} 

爲什麼程序編譯罰款? 如果我沒有錯的話標量類型在C++中沒有構造函數和析構函數。那麼,這個程序是否有明確的定義?在這種情況下,顯式調用析構函數是否會破壞variable a或者當函數執行完成時它會被編譯器自動銷燬?我知道在其生命週期結束後訪問對象在C++中有未定義的行爲。但是C++標準對此有何評論?

我在SO上發現了類似的問題here。通過@Columbo給出的答案說:

你不能要求標量類型析構函數,因爲他們沒有 之一。該聲明僅適用於模板代碼,其中您調用了不知道其類型的對象的析構函數 - 它刪除了爲標量(或甚至是 數組)類型編寫專門化的必要性。

所以,我不明白他給出的解釋。如果有人使用模板代碼來解釋它,那麼析構函數被稱爲類型未知的對象會更好。如果有人用簡單的例子解釋這個,我會很感激。

+0

@vsoftco:爲什麼到目前爲止沒有人給出答案?每當我發佈任何問題時都很快,但這次看起來很慢。 – Destructor

+0

我已經鏈接到完全相同的問題詢問其他地方 - 雖然該問題還沒有一個完整的答案,但它會被鏈接 –

+0

@vsoftco確定,擦除 –

回答

0

根據this

一個不重要的析構函數是不執行任何操作析構函數。具有瑣碎析構函數的對象不需要delete-expression,並且可以通過簡單地釋放其存儲來處理。所有與C語言兼容的數據類型(POD類型)都是可破壞的。

可能是與之相似的是,在C++中,你可以初始化像任何類類型對象的任何POD類型的對象,通過調用其與(init_val)構造例如int i(-1);

但是請注意,定義通話一個直接用於普通對象(如局部變量)的析構函數會在範圍末尾再次調用析構函數時調用未定義的行爲。

+1

那裏的「不採取行動」真的意味着它說什麼。一個微不足道的析構函數可以被調用多次或根本不調用,它沒有任何區別。 (No UB) – Potatoswatter

+0

@Patatoswatter 12.4中* trivial destructor *的定義表明,只有類類型可能具有析構函數(更不用說一個簡單的析構函數,它是滿足一定要求的類的非用戶聲明的析構函數) –

+0

@AlexLop。你的答案似乎矛盾,你是說OP的代碼導致未定義的行爲? –

相關問題