[問題] Delete class pointer

看板C_and_CPP作者 (孤獨地擁抱了真實 )時間12年前 (2012/05/16 12:36), 編輯推噓3(3019)
留言22則, 4人參與, 最新討論串1/1
程式碼(Code):(請善用置底文網頁, 記得排版) class A{ int Index; }; int main(){ A* my_A=new A; my_A->Index=3; delete my_A; cout<<my_A->Index<<endl; } 本來預期會有segmentation fault 但是卻還是可以跑完 雖然輸出是"1"不是"3" c++ reference上是說delete會讓pointer變成invalid 請問有辦法讓他報segmentation fault嗎? 還是只能加 my_A=null; 來完成?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.42.212

05/16 13:54, , 1F
SG要看系統
05/16 13:54, 1F

05/16 14:17, , 2F
invalid 是把使用權還給作業系統而已,該段空間不可能馬上
05/16 14:17, 2F

05/16 14:18, , 3F
變成禁止存取,這樣效率很差,而且報 SG 表示你寫的有 Bug
05/16 14:18, 3F

05/16 14:20, , 4F
理論上有 Bug 的程式就不該寫,甚至還需要用 if (p != 0)
05/16 14:20, 4F

05/16 14:21, , 5F
的情況,才對指標 p 作存取
05/16 14:21, 5F

05/16 14:38, , 6F
delete 後改為 nullptr
05/16 14:38, 6F

05/16 15:50, , 7F
主要是debug的過程希望能看到sg
05/16 15:50, 7F

05/16 15:51, , 8F
因為delete散在很多地方 怕不小心去用到delete過的
05/16 15:51, 8F

05/16 15:53, , 9F
只為了debug,就每次delete都去改成null有點累QQ
05/16 15:53, 9F

05/16 15:59, , 10F
這不是為了 debug ...
05/16 15:59, 10F

05/16 16:22, , 11F
平常就應該作的事情了
05/16 16:22, 11F

05/16 16:28, , 12F
先問你一個設計的問題, 為什麼會在一個指標有可能失效
05/16 16:28, 12F

05/16 16:29, , 13F
的情況下去使用它?
05/16 16:29, 13F

05/16 16:30, , 14F
我的做法是隨機應變,如果是像 tree, linked list 之類,
05/16 16:30, 14F

05/16 16:31, , 15F
你 delete 結點之後,那就設為 NULL,同樣指標類變數初值
05/16 16:31, 15F

05/16 16:32, , 16F
也 NULL。但類似你這類例子就不 NULL,你自己寫的時候就
05/16 16:32, 16F

05/16 16:33, , 17F
不應該把可以預期被刪除的東西拿來存取
05/16 16:33, 17F

05/16 16:37, , 18F
對了,即便你寫 delete p; p = NULL; 也不能確保其他變數
05/16 16:37, 18F

05/16 16:39, , 19F
沒有留下原本 p 的位址, 程式的本質問題沒有消失
05/16 16:39, 19F

05/16 17:32, , 20F
善用 smart pointer
05/16 17:32, 20F

05/16 18:01, , 21F
個人覺得有些情況還是用一個 block 包起來比較好, 看
05/16 18:01, 21F

05/16 18:02, , 22F
不到就不用怕存取違規, 非必要不會把物件建構在heap上
05/16 18:02, 22F
文章代碼(AID): #1Fiox2tP (C_and_CPP)