(已解決) C語言使用mysql_free_result()的時機為何? [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



(已解決) C語言使用mysql_free_result()的時機為何?
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3603
EXP: 6
離線
各位大大好~

小弟想請問一下

MYSQL_RES *result;

這樣宣告出來的result

當每次我在執行result = mysql_store_result( link );這段code時

是否是針對同一塊記憶體作存取?

換言之就是 在執行第二次result = mysql_store_result( link );時

是否會直接覆蓋第一次的result?

小弟的猜測如下:

不會直接覆蓋

因為result是指標

當程式在執行result = mysql_store_result( link );時

是把result指向某個暫存結果的記憶體位置

所以當第二次執行result = mysql_store_result( link );時

也只是把result指向另一個地方

所以 每當程式執行過一次result = mysql_store_result( link );後

就必須執行一次mysql_free_result( result );來釋放記憶體

想請教各位有經驗的大大

小弟以上的說法是否正確?

不正確的話 還望各位大大多多指教~

感激不盡 <(_ _)>

2013/3/7 21:09
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
管理員
註冊日期:
2011/3/11 6:32
所屬群組:
討論區管理群
等級: 44
HP : 216 / 1084
MP : 1088 / 26240
EXP: 38
離線
以下都是推測

迷途小書僮 寫到:
MYSQL_RES *result;
這樣宣告出來的result
當每次我在執行result = mysql_store_result( link );這段code時
是否是針對同一塊記憶體作存取?
換言之就是 在執行第二次result = mysql_store_result( link );時
是否會直接覆蓋第一次的result?
小弟的猜測如下:
不會直接覆蓋
因為result是指標
當程式在執行result = mysql_store_result( link );時
是把result指向某個暫存結果的記憶體位置
所以當第二次執行result = mysql_store_result( link );時
也只是把result指向另一個地方
所以 每當程式執行過一次result = mysql_store_result( link );後
就必須執行一次mysql_free_result( result );來釋放記憶體
想請教各位有經驗的大大
小弟以上的說法是否正確?

正確

2013/3/8 2:42
本篇發表文章以「創用CC BY 3.0 或更新之台灣地區版本」授權條款釋出,如何使用敬請參考
 Creative Commons — 姓名標示 3.0 台灣 — CC BY 3.0 TW
 http://creativecommons.org/licenses/by/3.0/tw/

「你不懂的東西就不要亂講,被懂得人看破手腳就算了,騙不懂的人誤導別人,還要別人把你當成大師,這就真的是說不過去了。」
 by Allen Own
 出處 http://www.plurk.com/p/i4uogm

自由知識創作平台介紹
 https://docs.google.com/document/d/1MGG6lW_0qCgH4U785R-IwSc_INdoBGej1l-JxiA4gPE
如何建立新的自由知識創作平台文件
 https://docs.google.com/document/d/11NdzOW2lGYksfyQIcPMPye5tlmj1J0QTkgPTmQvIvKA
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3603
EXP: 6
離線
請問V字龍大:

那如果我在程式中都不加mysql_free_result(result);的話

1.對執行該程式而言 有什麼壞處呢?程式執行效率變慢嗎?還是...?

2.程式執行完後 使用的記憶體應該也會自動釋放掉對吧?

麻煩大大解惑了 <(_ _)>

2013/3/8 23:35
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
管理員
註冊日期:
2011/3/11 6:32
所屬群組:
討論區管理群
等級: 44
HP : 216 / 1084
MP : 1088 / 26240
EXP: 38
離線
迷途小書僮 寫到:
那如果我在程式中都不加mysql_free_result(result);的話

1.對執行該程式而言 有什麼壞處呢?程式執行效率變慢嗎?還是...?

動態配置的記憶體沒釋放掉會造成 memory leak,除非系統重新啟動否則記憶體都回不來了......
迷途小書僮 寫到:
2.程式執行完後 使用的記憶體應該也會自動釋放掉對吧?

不會
C 語言無 garbage collection 功能
只要沒有釋放掉就會 memory leak

2013/3/9 0:39
本篇發表文章以「創用CC BY 3.0 或更新之台灣地區版本」授權條款釋出,如何使用敬請參考
 Creative Commons — 姓名標示 3.0 台灣 — CC BY 3.0 TW
 http://creativecommons.org/licenses/by/3.0/tw/

「你不懂的東西就不要亂講,被懂得人看破手腳就算了,騙不懂的人誤導別人,還要別人把你當成大師,這就真的是說不過去了。」
 by Allen Own
 出處 http://www.plurk.com/p/i4uogm

自由知識創作平台介紹
 https://docs.google.com/document/d/1MGG6lW_0qCgH4U785R-IwSc_INdoBGej1l-JxiA4gPE
如何建立新的自由知識創作平台文件
 https://docs.google.com/document/d/11NdzOW2lGYksfyQIcPMPye5tlmj1J0QTkgPTmQvIvKA
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3603
EXP: 6
離線
再請問V字龍大:

如何去驗證memory leak?

例如:

我在執行某個會導致memory leak的程式前先去記錄記憶體的資訊

然後執行完後再去比對?

是這樣驗證嗎?

如果是這樣驗證的話,在Ubuntu底下 我該去哪裡觀看記憶體的資訊呢?

麻煩大大了~ <(_ _)>

2013/3/9 0:45
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
管理員
註冊日期:
2011/3/11 6:32
所屬群組:
討論區管理群
等級: 44
HP : 216 / 1084
MP : 1088 / 26240
EXP: 38
離線
可以用 valgrind 的 memcheck 工具
valgrind 「原本的程式命令」
可執行檔需包含除錯用資料
範例
valgrind --tool=memcheck --leak-check=full bin/program.exe

使用方式請參考 valgrind 官網的教學

輸出範例
==4944==
==4944==
==4944== HEAP SUMMARY:
==4944== in use at exit: 400 bytes in 1 blocks
==4944== total heap usage: 1 allocs, 0 frees, 400 bytes allocated
==4944==
==4944== 400 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4944== at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4944== by 0x8048420: main (Test_program.cpp:12)
==4944==
==4944== LEAK SUMMARY:
==4944== definitely lost: 400 bytes in 1 blocks
==4944== indirectly lost: 0 bytes in 0 blocks
==4944== possibly lost: 0 bytes in 0 blocks
==4944== still reachable: 0 bytes in 0 blocks
==4944== suppressed: 0 bytes in 0 blocks
==4944==
==4944== For counts of detected and suppressed errors, rerun with: -v
==4944== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

2013/3/9 1:10
本篇發表文章以「創用CC BY 3.0 或更新之台灣地區版本」授權條款釋出,如何使用敬請參考
 Creative Commons — 姓名標示 3.0 台灣 — CC BY 3.0 TW
 http://creativecommons.org/licenses/by/3.0/tw/

「你不懂的東西就不要亂講,被懂得人看破手腳就算了,騙不懂的人誤導別人,還要別人把你當成大師,這就真的是說不過去了。」
 by Allen Own
 出處 http://www.plurk.com/p/i4uogm

自由知識創作平台介紹
 https://docs.google.com/document/d/1MGG6lW_0qCgH4U785R-IwSc_INdoBGej1l-JxiA4gPE
如何建立新的自由知識創作平台文件
 https://docs.google.com/document/d/11NdzOW2lGYksfyQIcPMPye5tlmj1J0QTkgPTmQvIvKA
應用擴展 工具箱
回覆: C語言使用mysql_free_result()的時機為何?
會員二級
註冊日期:
2012/6/27 20:43
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 176
MP : 27 / 3603
EXP: 6
離線
了解~

感謝V字龍大大!!

2013/3/9 12:04
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.