簡體   English   中英

關於物體壽命的問題:N3242草案

[英]Question on object lifetime : N3242 Draft

來自C ++ 11 n3242的一個要點,“子對象的持續時間,對象生存期”,3.8 / 1:

對象的生存期是對象的運行時屬性。 如果對象是類或聚合類型,並且其或其成員之一是由普通的默認構造函數以外的其他構造函數初始化的,則稱該對象具有非普通的初始化 [注:普通的復制/移動構造函數的初始化為非普通的-簡單的初始化。 —尾注]

類型為T的對象的生存期始於以下情況:

  • 獲得具有適合T型的對齊方式和大小的存儲,並且
  • 如果對象具有非平凡的初始化,則其初始化完成。

T型對象的生存期在以下情況下結束:

  • 如果T是具有非平凡析構函數(12.4)的類類型,則析構函數調用開始,或者
  • 對象占用的存儲空間被重用或釋放。

在這里,他們談到了具有對象生存期的平凡或非平凡的復制/移動構造函數。 有人可以用一些示例程序解釋嗎?

點的變化描述了類型T的對象的生存期何時開始,但是他們沒有提到T何時結束。 為什么?

在這里,他們談到了具有對象生存期的平凡或非平凡的復制/移動構造函數。 有人可以用一些示例程序解釋嗎?

這只是語義。 在所有情況下,都可以轉換為“構造函數完成運行后,對象的生存期開始”。 引用很全面,因為瑣碎的構造實際上並不涉及任何此類執行。

舉一個例子來說明這一點並不容易。 我可以向您展示平凡的和非平凡的構造函數,但是它並不能真正告訴您任何信息,因此我不會去做。

點的變化描述了類型T的對象的生命周期何時開始,但是他們沒有提到T何時結束。 為什么?

是的,他們確實。 現在,我應該重新格式化您問題中的引號,這一點應該更清楚了。

通常,當對象的構造函數運行完畢並存活到其析構函數開始時,該對象才是活動的。

一個例外是類型如此瑣碎,以至於沒有為它們運行構造函數,例如在代碼之后

int* p = (int*)malloc(1024);

即使沒有以任何方式初始化它們並且沒有執行任何構造函數,您仍有許多int仍然存在。 它們仍然在那里,您可以為其分配值。

暫無
暫無

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

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