[問題] delete [] 順序?

看板C_and_CPP (C/C++)作者 (xatier)時間14年前 (2012/05/17 07:18), 編輯推噓5(5044)
留言49則, 6人參與, 最新討論串1/2 (看更多)
開發平台(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

05/17 07:33, , 1F
你的觀念基本上是對的,在程式結束的時候也會delete
05/17 07:33, 1F

05/17 07:33, , 2F
不知道array跟繼承class的dtor有沒有關系
05/17 07:33, 2F

05/17 07:34, , 3F
繼承的話ctor是從父類別先,dtor是從子類別先
05/17 07:34, 3F

05/17 07:39, , 4F

05/17 07:53, , 5F
沒聽過、沒看過有書或人,保證 delete [] 時的 dtor 順序
05/17 07:53, 5F

05/17 07:54, , 6F
你也只是從結果看,也許別的系統不是這樣,應該不用在意吧
05/17 07:54, 6F

05/17 08:11, , 7F
恩,因為這個是老師的考題,我也很懷疑會不會是 undefined
05/17 08:11, 7F

05/17 08:11, , 8F
behavior ,所以上來問大家一下 :D
05/17 08:11, 8F

05/17 08:12, , 9F
@diabloevagto 明白了,感謝!
05/17 08:12, 9F

05/17 08:16, , 10F
我認為 array 內物件的建、解構順序應該是冷門而不重要的
05/17 08:16, 10F

05/17 08:17, , 11F
誰在乎同類別的物件先後順序呢?通常都是關心異類的,主要
05/17 08:17, 11F

05/17 08:18, , 12F
就是 1. base 的 ctor 早 dtor 晚; 2. 類別成員被定義(宣
05/17 08:18, 12F

05/17 08:19, , 13F
告) 的比較早的,則 ctor 也會比較早 (所以 dtor 就晚)
05/17 08:19, 13F

05/17 08:19, , 14F
http://goo.gl/U4cFq 這邊有人說是 in reverse order 的
05/17 08:19, 14F

05/17 08:20, , 15F
@purpose: 為什麼 ctor 比較早 dtor 會比較晚?這邊不懂@@
05/17 08:20, 15F

05/17 08:27, , 16F
剛剛又複習了一下這邊的概念,總算有點頭緒了,感謝 p 大!
05/17 08:27, 16F

05/17 08:31, , 17F
我回文講比較好寫
05/17 08:31, 17F

05/17 08:33, , 18F
恩恩,麻煩您了!謝謝! 等等下課再回來看 :P
05/17 08:33, 18F

05/17 09:04, , 19F
@x:可以這麼想,要先有父親才有兒子,所以要先有
05/17 09:04, 19F

05/17 09:04, , 20F
base的ctor才有sub的ctor
05/17 09:04, 20F

05/17 09:05, , 21F
至於dtor因為在sub內包含base的data,所以要先把sub
05/17 09:05, 21F

05/17 09:06, , 22F
dtor才能再把base dtor,可以想想如果先把base tor
05/17 09:06, 22F

05/17 09:06, , 23F
dtor
05/17 09:06, 23F

05/17 09:06, , 24F
那sub包含的東西不就不見了
05/17 09:06, 24F

05/17 09:06, , 25F
我大概是這樣理解的,有錯請指教@@
05/17 09:06, 25F

05/17 09:42, , 26F
要先有父親才有兒子 XDDDD
05/17 09:42, 26F

05/17 09:47, , 27F
try out -fno-elide-constructors option
05/17 09:47, 27F

05/17 09:50, , 28F
xtended initializer lists only available with -std=c++0
05/17 09:50, 28F

05/17 09:50, , 29F
這個是什麼意思阿@@ C++11 有新的規則?
05/17 09:50, 29F

05/17 09:51, , 30F
forces G++ to call the copy constructor in all cases
05/17 09:51, 30F

05/17 09:52, , 31F
看了一下 man g++,是強迫打開所有 copy ctor 的意思
05/17 09:52, 31F

05/17 09:54, , 32F
原本就有用 std=c++0x 的 flag,剛剛嘗試版主說的那行就忘
05/17 09:54, 32F

05/17 09:55, , 33F
了XDD 不過為什麼結果會變成 111222333321 呢@@?
05/17 09:55, 33F

05/17 10:10, , 34F
also try this code http://ideone.com/pdWiP
05/17 10:10, 34F

05/17 10:10, , 35F
keyword: initializer_list
05/17 10:10, 35F

05/17 10:26, , 36F
看起來是會丟給 move ctor 去工作
05/17 10:26, 36F

05/17 10:32, , 37F
所以正常情況下, 答案都不對 XD
05/17 10:32, 37F

05/17 10:32, , 38F
上課學到哪些 c++11 的 feature呢? 真羨慕 <3
05/17 10:32, 38F

05/17 12:30, , 39F
可是當這些 feature 變成作業海和考試山就悲劇了XDDDD
05/17 12:30, 39F

05/17 15:28, , 40F
一般的情況下,從系統分配記憶體的順序和歸還的順序
05/17 15:28, 40F

05/17 15:28, , 41F
應該是反過來的。最先分配的最晚歸還。
05/17 15:28, 41F

05/17 15:30, , 42F
這樣的效率最高並且可以減少記憶體碎片。
05/17 15:30, 42F

05/17 15:31, , 43F
用 [] 來 new 的記憶體是一整塊,但是在 class 裡面
05/17 15:31, 43F

05/17 15:32, , 44F
可能會需要從系統分配記憶體
05/17 15:32, 44F

05/17 15:33, , 45F
所以 delete 的時後順序倒過來,是正常釋放記憶體的順序
05/17 15:33, 45F

02/27 12:00, , 46F
C++11 working draft n3337,Sect. 12.6 :
02/27 12:00, 46F

02/27 12:01, , 47F
Destructors for the array elements are called in \
02/27 12:01, 47F

02/27 12:02, , 48F
reverse order of their construction.
02/27 12:02, 48F

02/27 12:02, , 49F
不過真的很冷門就是了@@
02/27 12:02, 49F
文章代碼(AID): #1Fj3MeUP (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Fj3MeUP (C_and_CPP)