看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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也是會呼叫建構子的http://ideone.com/8oD9I 01/11 19:21
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