Re: [問題] delete / new , free / malloc
所以我說「去看看 memory allocator 是怎麼做的」
實際上你觀察 new/delete 與 malloc/free
你給他們的資訊是一樣的:
int* p = new int[20];
...
delete[] p; // 你沒指定 20 這個數
int* p = (int*)malloc(sizeof(int)*20);
...
free(p); // 同樣也沒指定 sizeof(int)*20
free 既然不需要大小也能正確釋放,沒道理 delete 不行吧?
* * *
記憶體配置的過程大概是:(極為簡化的版本,真實過程相當複雜)
1. standard library 先向 OS 要一小塊記憶體,存在某個資料結構中。
2. 當你呼叫 malloc 或 new 的時候,它們會檢查結構中的記憶體是否足夠,
不足時再向 OS 要更多記憶體
(向 OS 要記憶體的過程往往很花時間,因此一次會要一大塊)
3. 配出足夠使用者需要的記憶體後,malloc/new 會記錄這個區塊的大小及位址,
然後把位置傳回給使用者
4. 當使用者呼叫 free/delete 的時候,再依照傳入的位址從記綠中取出大小,
然後把這個區塊設定為未使用
* * *
所以為什麼指標++後就不能 delete 了,因為你傳給 delete 的位址並不是
當初使用 new 時所記錄下來的位址,那 delete 怎麼可能知道區塊的大小。
而在你給的範例程式中,改用 new/delete 是可行的,
但是既然你前面使用 new char[...]
後面就應該把位址轉回成 char* 再進行 delete
除了與 destructor 有關外
C++ 允許不同的 class 對 new/delete 進行 overator overload
所以 delete 某個物件指標與 delete char* 可以是完全不同的兩回事
* * *
回到 MSDN 的範例
GetAdaptersInfo 這個函式的輸出雖然像一個 linked list
但很明顯地為了效率而把所有的 node (IP_ADAPTER_INFO) 放在連續的空間上
因此你才需要配置一塊大於 sizeof(IP_ADAPTER_INFO) 的空間
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.84.253
討論串 (同標題文章)
完整討論串 (本文為第 5 之 7 篇):