作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] delete / new , free / malloc
時間Wed Jan 11 18:25:52 2012
※ 引述《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: 220.135.3.139
推 kdjf:不少寫code的人其實不知到前因後果吧.. (自己就算XD 01/11 18:57
→ diabloevagto:new、delete與malloc、free最大的不同就是在於 01/11 19:22
→ diabloevagto:c++支援的會呼叫建構子及初始化,c只單純分配 01/11 19:23
推 BDFishX:littleshan說的是指new char[]不會呼叫IP_ADAPTER_INFO的 01/11 19:56
→ BDFishX:ctor,而非new不會call ctor吧? 01/11 19:56
→ diabloevagto:誤會了- -... 01/11 20:08
推 mingtai1:new char[]再轉型比較常用在客製化的memory pool.. 01/11 22:20
→ littleshan:通常不是直接轉 而是placement new 01/11 22:29