簡體   English   中英

構造函數成員初始化程序中引發了C ++異常?

[英]C++ exception thrown inside constructor member initializer?

請考慮以下情況:

struct X { ... };

struct Y
{
     Y(...);

     ...

     X x;

     ...
}

X f()
{
    ...

    if (...)
        throw E;

    ...
}

Y::Y(...) :
    ... ,
    x(f()) ,
    ...
{
    ...
}

這里有未定義的行為嗎? 拋出E時,這種設計是否有任何陷阱或潛在問題?

更新:

Y::x可能不是唯一的成員變量Y ,可能無法在班上第一個成員變量,並且可以通過初始化一半Y::Y初始化列表。

這里有未定義的行為嗎?

號的建造Y被中止。

拋出E時,這種設計是否有任何陷阱或潛在問題?

不會創建任何Y ,因此沒有要調用的析構函數。 用於完全構造的元素的析構x (在類體內在x之前聲明的那些析構函數)將被自動調用(否則您將如何知道初始化列表在拋出時的距離)。 如果需要銷毀任何東西,那么必須捕獲異常並自己銷毀它。 您無法吸收異常,可以將其重新拋出,拋出新的異常,或者什么也不做,這將導致異常被重新拋出。 對於您的特定用例,不應破壞任何東西,因為構造函數主體根本不會被調用。

當在對象的構造過程中引發異常時,將調用所有完全構造的子對象的析構函數。 也就是說,假設您的類型X拋出異常正確地清除了在拋出異常之前它可能已分配的所有資源,則沒有問題。

暫無
暫無

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

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