Re: [問題] free delete
※ 引述《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
05/24 08:20, 1F
→
05/24 08:21, , 2F
05/24 08:21, 2F
推
05/24 09:00, , 3F
05/24 09:00, 3F
→
05/24 09:26, , 4F
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
05/24 13:57, 8F
→
05/24 15:19, , 9F
05/24 15:19, 9F
→
05/24 15:19, , 10F
05/24 15:19, 10F
→
05/25 11:32, , 11F
05/25 11:32, 11F
→
05/25 11:33, , 12F
05/25 11:33, 12F
→
05/25 11:33, , 13F
05/25 11:33, 13F
怎麼會沒有? @"@ 罰你回去重看一遍~ (指
推
05/25 12:07, , 14F
05/25 12:07, 14F
感謝提醒, placement new為正確的說法, 已更正
※ 編輯: loveme00835 來自: 140.121.197.115 (05/25 13:43)
→
05/25 14:14, , 15F
05/25 14:14, 15F
→
05/25 14:15, , 16F
05/25 14:15, 16F
→
05/25 14:16, , 17F
05/25 14:16, 17F
討論串 (同標題文章)