[問題] C++ 判斷是不是new出來的物件

看板C_and_CPP (C/C++)作者 (wagaru)時間14年前 (2011/09/22 22:37), 編輯推噓2(2019)
留言21則, 6人參與, 最新討論串1/4 (看更多)
我把用到這個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

09/22 22:40, , 1F
看起來是有重覆delete了...(?)
09/22 22:40, 1F

09/22 22:40, , 2F
那就把你的程式改成所有東西都是 new 來的就好了...
09/22 22:40, 2F

09/22 22:41, , 3F
咦 我沒想到重覆 delete 的可能耶 XD
09/22 22:41, 3F

09/22 22:41, , 4F
不過他的 copy 寫得看起來沒什麼問題...
09/22 22:41, 4F

09/22 22:46, , 5F
建議給一個 main 使用這個 tree 並且能發生你說的問題
09/22 22:46, 5F

09/22 23:21, , 6F
未看先猜因為你呼叫第2個版本的建構子, 傳入不是new來
09/22 23:21, 6F

09/22 23:21, , 7F
的物件, 所以錯
09/22 23:21, 7F

09/22 23:25, , 8F
ctor那裡為什麼不是用**呢? 而是用reference,怪。
09/22 23:25, 8F

09/22 23:32, , 9F
你這樣寫只有Copyconstructor生
09/22 23:32, 9F

09/22 23:33, , 10F
出來的tree的child是new,用原本
09/22 23:33, 10F

09/22 23:34, , 11F
的constructor產生的instance的
09/22 23:34, 11F

09/22 23:35, , 12F
child並不是new出來的
09/22 23:35, 12F

09/22 23:39, , 13F
樓上說得對,完了,我下面的文章無法自刪。
09/22 23:39, 13F

09/22 23:40, , 14F
@@?
09/22 23:40, 14F

09/22 23:44, , 15F
我想到下面寫的文章ctor應該都指向同一個child,
09/22 23:44, 15F

09/22 23:45, , 16F
產生新的要刪掉舊的,那就完了?!
09/22 23:45, 16F

09/23 00:38, , 17F
恩 所以就會有些tree有new出來的物件 有些tree沒有
09/23 00:38, 17F

09/23 00:39, , 18F
現在就卡在delete只能刪new出來的物件
09/23 00:39, 18F

09/23 00:39, , 19F
用constructor 建出來的在解構式就會出錯
09/23 00:39, 19F

09/23 01:27, , 20F
你真的不願意給我們一個 main 看你怎麼使用這個嗎?
09/23 01:27, 20F

09/23 01:29, , 21F
是不是用建構子產生物件,跟是不是用new產生是沒有衝突的
09/23 01:29, 21F
※ 編輯: wagaru 來自: 175.96.117.5 (09/23 01:50)
文章代碼(AID): #1EUqWfwC (C_and_CPP)
文章代碼(AID): #1EUqWfwC (C_and_CPP)