作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] free delete
時間Tue May 24 01:52:21 2011
※ 引述《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:第一種和第二種只有分配空間,第三種才呼叫constructor 05/25 14:15
→ angleevil:Orz還是覺得好難 05/25 14:16