看板 C_and_CPP 關於我們 聯絡資訊
我把用到這個Tree的code補在回文裡啦… 我現在有一個class Tree,有三個成員是pointer 在copy時會new新的Tree 在destructor裡我想delete這些new出來的tree 因此我寫在解構式裡 但因為constructor 裡沒有用new,要delete用那種建構式建出的樹時就會出錯 請問是哪邊出問題了呢? 謝謝~ (如果講的不清楚我之後再補充…) ===================================================================== class Tree{ private: std::string root; Tree* left_child; Tree* right_child; public: //copy constructor Tree(const Tree& tree):left_child(0),right_child(0){ if(tree.left_child != 0) left_child = new Tree(*tree.getLeftChild()); if(tree.right_child!= 0) right_child = new Tree(*tree.getRightChild()); } //用下面這種建構式建出的樹 delete會出錯 //constructor Tree(std::string in_root, Tree &in_left, Tree &in_right): root(in_root),left_child(&in_left),right_child(&in_right){} ~Tree(){ if(left_child!=0) delete left_child; if(right_child!=0) delete right_child; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.96.117.5
james732:看起來是有重覆delete了...(?) 09/22 22:40
LPH66:那就把你的程式改成所有東西都是 new 來的就好了... 09/22 22:40
LPH66:咦 我沒想到重覆 delete 的可能耶 XD 09/22 22:41
LPH66:不過他的 copy 寫得看起來沒什麼問題... 09/22 22:41
james732:建議給一個 main 使用這個 tree 並且能發生你說的問題 09/22 22:46
loveme00835:未看先猜因為你呼叫第2個版本的建構子, 傳入不是new來 09/22 23:21
loveme00835:的物件, 所以錯 09/22 23:21
bleed1979:ctor那裡為什麼不是用**呢? 而是用reference,怪。 09/22 23:25
hellophoenix:你這樣寫只有Copyconstructor生 09/22 23:32
hellophoenix:出來的tree的child是new,用原本 09/22 23:33
hellophoenix:的constructor產生的instance的 09/22 23:34
hellophoenix:child並不是new出來的 09/22 23:35
bleed1979:樓上說得對,完了,我下面的文章無法自刪。 09/22 23:39
loveme00835:@@? 09/22 23:40
bleed1979:我想到下面寫的文章ctor應該都指向同一個child, 09/22 23:44
bleed1979:產生新的要刪掉舊的,那就完了?! 09/22 23:45
wagaru:恩 所以就會有些tree有new出來的物件 有些tree沒有 09/23 00:38
wagaru:現在就卡在delete只能刪new出來的物件 09/23 00:39
wagaru:用constructor 建出來的在解構式就會出錯 09/23 00:39
james732:你真的不願意給我們一個 main 看你怎麼使用這個嗎? 09/23 01:27
james732:是不是用建構子產生物件,跟是不是用new產生是沒有衝突的 09/23 01:29
※ 編輯: wagaru 來自: 175.96.117.5 (09/23 01:50)