簡體   English   中英

在對象銷毀期間調用的函數

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

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