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