作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題Re: [問題] delete / new , free / malloc
時間Wed Jan 11 23:02:59 2012
L大您好
因為看MSDN他這樣寫用malloc
他其實這API正確的用法應該是
先GetAdaptersInfo(NULL, &ulOutBufLen) 他會吐回該分配多少mem
所以我才說他實際上的ulOutBufLen 有可能會大於 sizeof這struct
因為他用malloc 我在想說如果用new / delete會不會比較合適
但就越想越怕說 我會造成mem leak..
因為我實在不曉得她怎麼去維護他到底new了多少
而且也不曉得為啥我做了指標的++後
delete就會造成assertion
以這個case 是不是就用malloc / free 就好了
至於delete [] 或是delete 都會確實整塊free
我想應該是VC編譯的時候做的手腳?
還滿神奇的
謝謝
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: ※ 引述《QQ29 (我愛阿蓉)》之銘言:
: : 但聽說 能用new / delete 就盡量用
: 不要相信「聽說」
: 你要先理解為什麼要選擇 new/delete
: : 所以
: : 我想使用new 這operator來做
: : 但有個疑問
: : ulOutBufLen 這個值 有可能 "大於" sizeof(IP_ADAPTER_INFO).
: : 假如我用
: : pAdapterInfo = (IP_ADAPTER_INFO *) new char[ulOutBufLen];
: : 這樣安全嗎
: No, 這不是好的 C++
: 王道寫法應該是這樣: pAdapterInfo = new IP_ADAPTER_INFO;
: : 如果沒問題的話
: : 我使用
: : delete pAdapterInfo; 就能把這一串連續空間標記起來嗎?
: 他會歸還所有的空間
: 但是
: 但是在歸還所有空間之前會先炸掉
: 因為你前面用 new char[] 所以沒呼叫 IP_ADAPTER_INFO 的 ctor
: 這邊卻 delete 一個指向 IP_ADAPTER_INFO 的 pointer 所以會呼叫 dtor
: 這個例子中因為 IP_ADAPTER_INFO 是一個 POD struct
: 沒有 ctor/dtor 所以不會引發問題
: : 相較於delete / new
: : malloc / free 是不是就沒這問題了?
: : free(pAdapterInfo) 他就是會從 這個起始位址 free到 他剛剛配置的空間的結尾. 因為
: : 我看他範例就直接free了...
: : ps.請問有沒有什麼方式 可以驗證 我確實delete 標記掉了多少byte嗎?
: : 因為我也不知道我自己這樣寫有沒有問題~~ 謝謝
: : 謝謝
: standard library 會自行記錄每塊分配出去的記憶體占多少空間
: 所以歸還的時候不需要指定大小
: 這點 free 和 delete 是相同的
: 不過我覺得你比較大的問題是不知道前因後果就開始寫code了...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.192.137.84
→ purincess:windows api本來就純C, 老實講我覺得直接跟他互動的code 01/11 23:20
→ purincess:用malloc沒什麼不可以的 XD 01/11 23:21