[問題] 需要特別在 catch 中去 delete 變數嗎?

看板C_and_CPP作者 (蜂蜜派)時間12年前 (2011/12/30 11:04), 編輯推噓1(1015)
留言16則, 3人參與, 最新討論串1/1
如題,假設我 new 了一個變數並在結束時delete。 而我的 function 中有使用 try + catch。 那麼,假設真的發生了exception,會跑到catch。 我需要為了避免 memory leakage 而在 catch 中手動加入 delete 的 code 嗎? 意即需要特地加入下面 code 中的紅色部分嗎? 感謝。 int data = new int [1024]; try { // do many things } catch (...) { if (data) { delete [] data; data = NULL; } } // 原本就有在結束時 delete if (data) { delete [] data; data = NULL; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.66.17.92 ※ 編輯: Fightsea 來自: 61.66.17.92 (12/30 11:07) ※ 編輯: Fightsea 來自: 61.66.17.92 (12/30 11:07)

12/30 11:10, , 1F
不用,他跳出來一樣會執行到最後,可以用單布看看
12/30 11:10, 1F

12/30 11:22, , 2F
執行完 catch 後不會直接離開 function 嗎?
12/30 11:22, 2F

12/30 11:23, , 3F
我的意思是:程式壞掉了(exception),還需要繼續往下跑嗎?
12/30 11:23, 3F

12/30 11:38, , 4F
exception不一定表示程式壞掉啊
12/30 11:38, 4F

12/30 11:38, , 5F
比如說檔案打不開,可以提示使用者選擇另一個檔案
12/30 11:38, 5F

12/30 11:40, , 6F
catch區塊執行完後,程式會當作沒事般繼續往下執行
12/30 11:40, 6F

12/30 11:40, , 7F
所以在這個例子中,不需要在catch中加入delete
12/30 11:40, 7F

12/30 11:40, , 8F
有可能要也有可能不用,看你的catch處理什麼,用
12/30 11:40, 8F

12/30 11:41, , 9F
你可以用單步執行去看就知道了
12/30 11:41, 9F

12/30 11:41, , 10F
但是這支程式仍然有潛在的memory leak
12/30 11:41, 10F

12/30 11:41, , 11F
除非說你的catch(...)就如同字面上的意思
12/30 11:41, 11F

12/30 11:41, , 12F
是要攔下任意型別的exception
12/30 11:41, 12F

12/30 11:43, , 13F
否則如果產生你未指定的exception型別,會直接跳出函式
12/30 11:43, 13F

12/30 11:43, , 14F
所以你應該用 vector 來取代 new int[1024]
12/30 11:43, 14F

12/30 11:44, , 15F
這麼一來後面的 delete 也可以省略了
12/30 11:44, 15F

12/30 11:56, , 16F
我了解了,非常感謝~
12/30 11:56, 16F
文章代碼(AID): #1E_IeoVp (C_and_CPP)