看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《singlovesong (~"~)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : g++ : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : none : 問題(Question): : free 跟delete 的行為 : =============== : 請問free 跟 delete 會幫我把“指到的記憶體內的ptr指到的記憶體”都free 掉嗎? : 也就是說 假設我用pointer 寫了一個Btree : free(rootPtr) or delete rootPtr; : 會幫我把整棵數都free 掉嗎 : 還是說只會把root 給free 掉呢? : 謝謝@@ 你會問表示你把它們當作同樣的東西 XD delete operator 所做的事情依序如下: 1.呼叫 destructor 2.釋放該物件所佔用的記憶體空間 free 只會做(2)而已, 這也是 new/delete、malloc/free規定要成 對呼叫的原因之一. 你釋放資源的程式碼可以寫在 dtor裡面, 然後被自動呼叫, 而且 內容也很簡單, 仿照 postorder traversal 的形式: TreeNode::~TreeNode() { delete left_subtree; delete right_subtree; } dtor內唯一兩行作的事情就是叫子節點去把它們的子樹都清光光, 然後在清完之後把兩節點所佔用的記憶體歸還給系統( Linked List也可以這樣玩). 真正功能和free一樣的是這個: void operator delete( void * ); 它也是只做記憶體釋放的動作, 只不過還是要和 operator new 搭配使用就是了: 1. void *memory = operator new(sizeof(std::string)); 2. new (memory) std::string("hello"); 3. 4. std::string *ps = static_cast<std::string*>( memory ); 5. std::cout << *ps << std::endl; 6. 7. ps->std::string::~string(); 8. operator delete( memory ); 不過這通常表示你連 placement new 也要學起來(第2行)... 之所以會有這麼多版本new/delete的原因是為了讓你能夠依照自己 喜歡的方式來為某個類別的物件配置記憶體(如:可以讓所有的物件 都活在同一個大陣列裡), 不過隨著std::scoped_allocator<T> 的 出現, 直接覆蓋掉全域的operator new/delete 變成相對彈性差的 作法. -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
angleevil:對板主的景仰如滔滔江海,竟然有辦法把replacement new 05/24 08:20
angleevil:解釋那麼清晰簡單 05/24 08:21
singlovesong:謝謝! 不過前半看得懂 後半要菸酒一下了0.0 05/24 09:00
angleevil:= =後半段,你可能要先看effective c++讓你腦子非常痛 05/24 09:26
angleevil:你才會發現板大的實力深不見底 05/24 09:27
樓上也太誇張...= ="
abzxcx:推版主五顏六色的詳細解釋 05/24 10:11
xatier:推板主精采絕倫講解 05/24 10:54
netio:推板主 std::string共出現了5次 好煩的寫法XD 05/24 13:57
xatier:有時候用using namespace std; 的確會比較方便,但有時分開 05/24 15:19
xatier:會比較好 05/24 15:19
angleevil:~"~版主一點也不誇張,因為effective c++主要講解觀念 05/25 11:32
angleevil:其他網站也沒有placement new的例子,我當初就直接 05/25 11:33
angleevil:放棄這東東 05/25 11:33
怎麼會沒有? @"@ 罰你回去重看一遍~ (指
purpose:請問一下 replacement new 與 placement new 相同嗎? 05/25 12:07
感謝提醒, placement new為正確的說法, 已更正 ※ 編輯: loveme00835 來自: 140.121.197.115 (05/25 13:43)
angleevil:http://0rz.tw/PVNBx <--placement new 05/25 14:14
angleevil:第一種和第二種只有分配空間,第三種才呼叫constructor 05/25 14:15
angleevil:Orz還是覺得好難 05/25 14:16