Re: [問題] free delete

看板C_and_CPP作者 (朴髮箍)時間14年前 (2011/05/24 01:52), 編輯推噓6(6011)
留言17則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《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

05/24 08:20, , 1F
對板主的景仰如滔滔江海,竟然有辦法把replacement new
05/24 08:20, 1F

05/24 08:21, , 2F
解釋那麼清晰簡單
05/24 08:21, 2F

05/24 09:00, , 3F
謝謝! 不過前半看得懂 後半要菸酒一下了0.0
05/24 09:00, 3F

05/24 09:26, , 4F
= =後半段,你可能要先看effective c++讓你腦子非常痛
05/24 09:26, 4F

05/24 09:27, , 5F
你才會發現板大的實力深不見底
05/24 09:27, 5F
樓上也太誇張...= ="

05/24 10:11, , 6F
推版主五顏六色的詳細解釋
05/24 10:11, 6F

05/24 10:54, , 7F
推板主精采絕倫講解
05/24 10:54, 7F

05/24 13:57, , 8F
推板主 std::string共出現了5次 好煩的寫法XD
05/24 13:57, 8F

05/24 15:19, , 9F
有時候用using namespace std; 的確會比較方便,但有時分開
05/24 15:19, 9F

05/24 15:19, , 10F
會比較好
05/24 15:19, 10F

05/25 11:32, , 11F
~"~版主一點也不誇張,因為effective c++主要講解觀念
05/25 11:32, 11F

05/25 11:33, , 12F
其他網站也沒有placement new的例子,我當初就直接
05/25 11:33, 12F

05/25 11:33, , 13F
放棄這東東
05/25 11:33, 13F
怎麼會沒有? @"@ 罰你回去重看一遍~ (指

05/25 12:07, , 14F
請問一下 replacement new 與 placement new 相同嗎?
05/25 12:07, 14F
感謝提醒, placement new為正確的說法, 已更正 ※ 編輯: loveme00835 來自: 140.121.197.115 (05/25 13:43)

05/25 14:14, , 15F
http://0rz.tw/PVNBx <--placement new
05/25 14:14, 15F

05/25 14:15, , 16F
第一種和第二種只有分配空間,第三種才呼叫constructor
05/25 14:15, 16F

05/25 14:16, , 17F
Orz還是覺得好難
05/25 14:16, 17F
文章代碼(AID): #1DsfxPkd (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1DsfxPkd (C_and_CPP)