[問題] 如何確認是否 free 對記憶體

看板C_and_CPP作者 (Windows)時間11年前 (2012/11/02 00:14), 編輯推噓2(2028)
留言30則, 10人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DEV C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) #include "stdio.h" #include "stdlib.h" #include "string.h" 問題(Question): 不好意思,太淺的我又來討打了 >"< 使用 malloc 完的記憶題 必須要 free 掉,這我知道 不過,想請問各位大大如何去確認你free掉的 是不是對的地方!? 因為最近再寫一個有點極為複雜結構的程式,指來指去 有時候都會搞亂掉現在 Type 到底是 指指標 還是 指標 = =a 深怕會 free 錯塊,目前我有兩種方法,想請教版上大大們 可以這麼做嘛!? 舉個簡單的例子來問好了,如 : http://codepad.org/g12UVEf7 方法一. 有想過 在當 malloc 出來的該塊記憶體時候也印出起始位置, 然後在 free 之前也在印出是否一樣來確認沒free錯塊 就像 這個例子 : http://codepad.org/h9SPuyNC 但是 不知道我這樣做到底正不正確。 方法二. 這招是我友人跟我說的另一個方法,他說就free掉之後 原本指標變數裡的存的位置還沒變之前,再一次寫入看看能不能寫 如果有當掉,就代表 可能真的 free 成功了! 寫法就像 : http://codepad.org/SNrJa7jq 像這個例子。他就真的會當了,但又當結構很複雜 function 呼叫來呼叫去的 有時候 free 掉再寫,我發現不一定會當耶... 所以我也對方法二很懷疑... = =a 想請問各位大大們 都用什麼方式 check 啊!? -- 你都怎麼判斷啊!? -- 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.161.11.204

11/02 00:22, , 1F
方法二不能用..
11/02 00:22, 1F

11/02 00:23, , 2F
會建議借助工具,譬如VC就可以抓Memory Leak的空間
11/02 00:23, 2F

11/02 00:24, , 3F
另外…free完之後印出來的東西其實不會改變
11/02 00:24, 3F

11/02 00:31, , 4F
11/02 00:31, 4F

11/02 00:33, , 5F
11/02 00:33, 5F

11/02 00:38, , 6F
J大,Dev 有類似的借助工具之類的嗎!?
11/02 00:38, 6F

11/02 00:39, , 7F
dev 和 c::b 都沒有,必須自己刻。
11/02 00:39, 7F

11/02 00:43, , 8F
valgrind, 但 windowns 版的沒試過XD
11/02 00:43, 8F

11/02 00:44, , 9F
linux 上那真的是不二選擇了
11/02 00:44, 9F

11/02 00:45, , 10F
我是用 Windows ....>"<
11/02 00:45, 10F

11/02 00:51, , 11F
其實..我上面的推文連結已有給一份 solution 了..
11/02 00:51, 11F

11/02 00:51, , 12F
請問一下,那我方法一 是否是OK的!?
11/02 00:51, 12F

11/02 00:52, , 13F
free(x)不管成功或失敗,x的值都不會改變啊...
11/02 00:52, 13F

11/02 00:52, , 14F
你的方法1要怎麼確認呢?
11/02 00:52, 14F

11/02 01:01, , 15F
不是只要將 malloc 出來的位置 丟給 free 就會成功囉!!!?
11/02 01:01, 15F

11/02 01:02, , 16F
那你要怎麼分辨「是不是對的地方」?基本上做不到的...
11/02 01:02, 16F

11/02 01:27, , 17F
感覺有簽名檔的feeling
11/02 01:27, 17F

11/02 11:10, , 18F
如果你考量的點在於怕會不小心寫出 bug 的話,
11/02 11:10, 18F

11/02 11:11, , 19F
我會建議你從打字的順序開始著手,以你的情況就是
11/02 11:11, 19F

11/02 11:13, , 20F
打完 p = malloc(...) 以後接著在正確的地方打 free(p)
11/02 11:13, 20F

11/02 11:14, , 21F
刪行的時候也要注意,malloc 跟 free 也要同時刪。
11/02 11:14, 21F

11/02 14:35, , 22F
→ Linux:我是用 Windows ....>"< 簽名檔 get!!
11/02 14:35, 22F

11/02 17:26, , 23F
linotwo 大~ 因為有時候會在別的function內 malloc
11/02 17:26, 23F

11/02 17:27, , 24F
用把指標變數以 & 傳過去,用指指標變數收,然後才在該函式
11/02 17:27, 24F

11/02 17:28, , 25F
內 malloc,然後 我free 也是再用另外的 函式寫 統一 free
11/02 17:28, 25F

11/02 17:29, , 26F
掉 結構,以及結構內的所 malloc 的記憶體,所以深怕搞錯>"<
11/02 17:29, 26F

11/02 17:53, , 27F
即使是你自己寫的,配置跟釋放的函式也確保讓它成對出現
11/02 17:53, 27F

11/02 17:54, , 28F
這樣應該就不用擔心會搞錯了吧。
11/02 17:54, 28F

11/02 21:20, , 29F
這樣的 ID 沒問題嘛XD
11/02 21:20, 29F

11/03 19:58, , 30F
突然發現有這魔奇妙的ID XD
11/03 19:58, 30F
文章代碼(AID): #1Gaf_DS- (C_and_CPP)
文章代碼(AID): #1Gaf_DS- (C_and_CPP)