[英]Function, called during the object destruction
您能否提供反映以下規則的代碼示例:
N3797 c ++ 14,第3.6.3 / 2節:
如果函數包含已銷毀的靜態或線程存儲持續時間的塊范圍對象,並且在銷毀具有靜態或線程存儲持續時間的對象期間調用該函數,則如果控制流通過該程序,則該程序具有未定義的行為。先前銷毀的塊范圍對象的定義。
這個給你:
void theFunction()
{
static std::unique_ptr<int> foo { new int(42) };
}
struct Creator
{
Creator() { theFunction(); }
};
struct Destroyer
{
~Destroyer() { theFunction(); }
};
Destroyer d;
Creator c;
int main()
{}
d
首先創建,但它的構造函數什么都不做。 然后,創建c
,並且作為其初始化的一部分, theFunction()
,這將導致塊范圍靜態存儲持續時間變量foo
被初始化。
然后,在程序退出時,靜態存儲對象以相反的構造順序銷毀。 所以foo
被破壞了,然后是c
。 最后, d
被銷毀,但是它的析構函數調用了theFunction()
,這導致控制流在已經被銷毀之后再次到達foo
的定義。
您顯示的標准引用歸因於此未定義的行為。
struct Counter {
int *ptr;
Counter() {ptr = new int; *ptr = 0;};
int next() {return (*ptr)++;}
~Counter() {delete ptr;}
};
int function() {
static Counter c;
return c.next();
}
struct Obj {
~Obj() {cout<<function()<<endl;}
};
Obj obj;
int main() {
cout<<function()<<endl;
}
首先,正在創建obj。 然后主調用函數和正在創建計數器c。 當程序終止時,可能會在obj之前銷毀Counter c。 當obj被銷毀時,應該執行該函數但是它的靜態變量已經消失......所以未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.