Re: [問題] delete / new , free / malloc

看板C_and_CPP作者 (我要加入劍道社!)時間14年前 (2012/01/12 00:27), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/7 (看更多)
所以我說「去看看 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
文章代碼(AID): #1F3RY0oT (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1F3RY0oT (C_and_CPP)