作者wagaru (wagaru)
看板C_and_CPP
標題Re: [問題] C++ 判斷是不是new出來的物件
時間Fri Sep 23 01:48:19 2011
補一下我應用的例子好了…
不過剛剛省略了一個建構子
Tree(std::string in_root):root(in_root),left_child(0),right_child(0){}
=================
TreeParser.cpp
=================
Tree buildTreeFromString(std::string str){
......
//如果是葉子,也就是left_child,right_child都是空
if(isLeaf()){
std::string root = ...
Tree tree(root); <--------剛剛省略了這個建構子,補在下面
return tree;
}
//有左小孩與右小孩,也就是left_child,right_child不為空
else if(...){
std::string root = ...
Tree l_child(buildTreeFromString(...));
Tree r_child(buildTreeFromString(...));
Tree tree(root,l_child,r_child);
return tree;
}
}
我在想
在local的tree要回傳時會呼叫copy constructor拷貝一份,所以會用到new
而local的tree要釋放時有可能沒有new出來的物件,所以會出錯…吧…
※ 引述《wagaru (wagaru)》之銘言:
=====================================================================
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
※ 編輯: wagaru 來自: 175.96.117.5 (09/23 01:51)
推 LPH66:這樣的話上篇大家其實都猜到問題點了 09/23 02:06
→ LPH66:解決方法就是請把所有的 Tree 都用 new 的要來就好 09/23 02:07