[問題] 關於c++記憶體釋放的問題

看板C_and_CPP作者 (happy)時間14年前 (2011/12/08 03:13), 編輯推噓1(1015)
留言16則, 5人參與, 最新討論串1/1
不好意思 想請問一下大家 之前在書上看到 上面寫說進行動態記憶體配置只要用到new運算子 接下來都要利用delete運算子來釋放記憶體 但我剛剛在研讀c++ 當中的abstract base class時 有上網去找到一些範例 但看到其中例子覺得很奇怪 網址如下: http://ppt.cc/!MnA 總共有兩個例子 看完後覺得很奇怪 我知道內部的 Shape* shapes [ 3 ]; 是為了要準備用來指向抽象類別指標的陣列 shapes [0] = new Circle (2.0); shapes [1] = new Rectangle (1.0, 3.0); shapes [2] = new Rectangle (4.0, 2.0); 而這三條有用到new運算子 但沒看到程式進行記憶體釋放的動作 於是就自己在main()函數裡面加了這一條 delete[] shapes; 可是用visual studio 2005去執行時卻出現錯誤= = 沒加的時候卻可以跑 但這樣不就沒有進行記憶體釋放.... 想請問一下大家為什麼 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.155.19

12/08 03:22, , 1F
他是忘了加上delete沒錯, 但你怎麼可以delete陣列= =
12/08 03:22, 1F

12/08 03:27, , 2F
可是不是用陣列做動態記憶體配置 為什麼不能這樣做0.0
12/08 03:27, 2F

12/08 03:35, , 3F
陣列的每個元素是new出來的 但是陣列不是new出來的XD
12/08 03:35, 3F

12/08 03:35, , 4F
所以你要做的應該是delete shapes[0], delete shapes[1]
12/08 03:35, 4F

12/08 03:35, , 5F
如此這般
12/08 03:35, 5F

12/08 03:36, , 6F
要 delete [] 的話 一開始應該是new Shape[3]
12/08 03:36, 6F

12/08 03:36, , 7F
但是基本上這樣沒辦法達到原文那樣指
12/08 03:36, 7F

12/08 03:36, , 8F
Circle/Rectangle的效
12/08 03:36, 8F

12/08 03:37, , 9F
果(的樣子...? 我記得好像還有甚麼placement new之類的
12/08 03:37, 9F

12/08 03:37, , 10F
現在太晚腦袋不清楚了XD)
12/08 03:37, 10F

12/08 10:36, , 11F
placement new 是用來在已經alloc好的空間內建構物件
12/08 10:36, 11F

12/08 12:11, , 12F
delete [] 代表是 ** 不是一維指標
12/08 12:11, 12F

12/08 12:11, , 13F
而你的shapes本身並非二維指標,亂刪當然掛點
12/08 12:11, 13F

12/08 12:13, , 14F
delete x -> x是一維 delete [] y -> y是二維
12/08 12:13, 14F

12/08 12:14, , 15F
應該不難理解吧? 不然,你覺得靜態指標能被刪嗎?
12/08 12:14, 15F

12/08 12:14, , 16F
shapes本身只是個一重指標,別亂刪
12/08 12:14, 16F
文章代碼(AID): #1EtxhMiI (C_and_CPP)