看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Ubuntu Linux 12.04 / gcc 4.6.3 問題(Question): 期中考筆試考題,以下 code 的 output 是什麼? #include <iostream> using namespace std; struct T { T(int n=0) : a(n) {cout << a;} ~T() {cout << a ;} int a; }; int main (void) { delete [] new T[3] {1, 2, 3}; return 0; } 預期的正確結果(Expected Output): 123123 錯誤結果(Wrong Output): 123321 補充說明(Supplement): 用 delete [] 釋放 new [] 來的 array 時, 他去呼叫 dtor 的順序為什麼是倒過來的?這樣設計有什麼特別原因嗎? 對於 C++ 裏面物件何時呼叫自己的 dtor 把殺死自己的時間點不是很清楚 我只知道一般物件(區域變數)在碰到區塊 } 時會結束生命 而動態 new 出來的物件則是要自己 delete 時才會去找 dtor 求詳細觀念導正@@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.247.99
diabloevagto:你的觀念基本上是對的,在程式結束的時候也會delete 05/17 07:33
diabloevagto:不知道array跟繼承class的dtor有沒有關系 05/17 07:33
diabloevagto:繼承的話ctor是從父類別先,dtor是從子類別先 05/17 07:34
diabloevagto:http://ideone.com/GhSeA 05/17 07:39
purpose:沒聽過、沒看過有書或人,保證 delete [] 時的 dtor 順序 05/17 07:53
purpose:你也只是從結果看,也許別的系統不是這樣,應該不用在意吧 05/17 07:54
xatier:恩,因為這個是老師的考題,我也很懷疑會不會是 undefined 05/17 08:11
xatier:behavior ,所以上來問大家一下 :D 05/17 08:11
xatier:@diabloevagto 明白了,感謝! 05/17 08:12
purpose:我認為 array 內物件的建、解構順序應該是冷門而不重要的 05/17 08:16
purpose:誰在乎同類別的物件先後順序呢?通常都是關心異類的,主要 05/17 08:17
purpose:就是 1. base 的 ctor 早 dtor 晚; 2. 類別成員被定義(宣 05/17 08:18
purpose:告) 的比較早的,則 ctor 也會比較早 (所以 dtor 就晚) 05/17 08:19
xatier:http://goo.gl/U4cFq 這邊有人說是 in reverse order 的 05/17 08:19
xatier:@purpose: 為什麼 ctor 比較早 dtor 會比較晚?這邊不懂@@ 05/17 08:20
xatier:剛剛又複習了一下這邊的概念,總算有點頭緒了,感謝 p 大! 05/17 08:27
purpose:我回文講比較好寫 05/17 08:31
xatier:恩恩,麻煩您了!謝謝! 等等下課再回來看 :P 05/17 08:33
diabloevagto:@x:可以這麼想,要先有父親才有兒子,所以要先有 05/17 09:04
diabloevagto:base的ctor才有sub的ctor 05/17 09:04
diabloevagto:至於dtor因為在sub內包含base的data,所以要先把sub 05/17 09:05
diabloevagto:dtor才能再把base dtor,可以想想如果先把base tor 05/17 09:06
diabloevagto: dtor 05/17 09:06
diabloevagto:那sub包含的東西不就不見了 05/17 09:06
diabloevagto:我大概是這樣理解的,有錯請指教@@ 05/17 09:06
xatier:要先有父親才有兒子 XDDDD 05/17 09:42
loveme00835:try out -fno-elide-constructors option 05/17 09:47
xatier:xtended initializer lists only available with -std=c++0 05/17 09:50
xatier:這個是什麼意思阿@@ C++11 有新的規則? 05/17 09:50
xatier:forces G++ to call the copy constructor in all cases 05/17 09:51
xatier:看了一下 man g++,是強迫打開所有 copy ctor 的意思 05/17 09:52
xatier:原本就有用 std=c++0x 的 flag,剛剛嘗試版主說的那行就忘 05/17 09:54
xatier:了XDD 不過為什麼結果會變成 111222333321 呢@@? 05/17 09:55
loveme00835:also try this code http://ideone.com/pdWiP 05/17 10:10
loveme00835:keyword: initializer_list 05/17 10:10
xatier:看起來是會丟給 move ctor 去工作 05/17 10:26
loveme00835:所以正常情況下, 答案都不對 XD 05/17 10:32
loveme00835:上課學到哪些 c++11 的 feature呢? 真羨慕 <3 05/17 10:32
xatier:可是當這些 feature 變成作業海和考試山就悲劇了XDDDD 05/17 12:30
linotwo:一般的情況下,從系統分配記憶體的順序和歸還的順序 05/17 15:28
linotwo:應該是反過來的。最先分配的最晚歸還。 05/17 15:28
linotwo:這樣的效率最高並且可以減少記憶體碎片。 05/17 15:30
linotwo:用 [] 來 new 的記憶體是一整塊,但是在 class 裡面 05/17 15:31
linotwo:可能會需要從系統分配記憶體 05/17 15:32
linotwo:所以 delete 的時後順序倒過來,是正常釋放記憶體的順序 05/17 15:33
snaketsai:C++11 working draft n3337,Sect. 12.6 : 02/27 12:00
snaketsai:Destructors for the array elements are called in \ 02/27 12:01
snaketsai:reverse order of their construction. 02/27 12:02
snaketsai:不過真的很冷門就是了@@ 02/27 12:02