看板 C_and_CPP 關於我們 聯絡資訊
看過你的程式後,我寫了個很簡單的測試: int main() { Tree left_tree("HELLO"); Tree right_tree("WORLD"); Tree tree("james732", left_tree, right_tree); } 這個程式可以正常編譯,但執行時就會掛掉 其實問題就跟你講的差不多,left_tree 與 right_tree 並不是 new 出來的 而 tree 擁有 left_tree 與 right_tree 的指標後,卻對它們做 delete 因此,你的 constructor 可以這麼修改: Tree(std::string in_root, Tree &in_left, Tree &in_right): root(in_root) { left_child = new Tree(in_left); right_child = new Tree(in_right); } 這樣 main 裡的 left_tree 與 right_tree 都會被 new 複製一次 之後就可以很合理的被 delete 掉了 請記得一件事:你的物件跑了幾次的 new, 就應該跑幾次的 delete // copy constructor 裡面有兩個 new 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()); } // 這個 constructor 裡面卻沒有用到 new Tree(std::string in_root, Tree &in_left, Tree &in_right): root(in_root),left_child(&in_left),right_child(&in_right){} // destructor 有兩個 delete ~Tree(){ if(left_child!=0) delete left_child; if(right_child!=0) delete right_child; } 以這段程式來說,如果跑 copy constructor,執行兩次 new 後再兩次 delete 很合理 但跑另一個 constructor,沒有半個 new 但它還是會兩次 delete,很容易出事 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.35.184.77 ※ 編輯: james732 來自: 114.35.184.77 (09/23 02:14)
wagaru:謝謝大大我正在改… 09/23 02:12