c++ primer Exercise 13.28,兴冲冲地写出了一个支持深拷贝的二叉树,测试却在destructor那里一直出bug。这是我的树
class TreeNode {
public:
TreeNode(string val = "", int cnt = 0) :value(val), count(cnt), left(nullptr), right(nullptr) {};
TreeNode(const TreeNode &node) :value(node.value), count(node.count) {
if (node.left)
left = new TreeNode(*node.left);
if (node.right)
right = new TreeNode(*node.right);
};
TreeNode &operator=(const TreeNode &node) {
value = node.value;
count = node.count;
if (node.left)
left = new TreeNode(*node.left);
if (node.right)
right = new TreeNode(*node.right);
}
TreeNode &add_left(TreeNode *node) {
left = node;
return *this;
}
TreeNode &add_right(TreeNode *node) {
right = node;
return *this;
}
~TreeNode() {
cout << "destructing " <<value<< endl;
delete left;
left = nullptr;
delete right;
right = nullptr;
}
private:
string value;
int count;
TreeNode *left;
TreeNode *right;
};
class BinStrTree {
public:
//BinStrTree() :root(new TreeNode) {};
BinStrTree(TreeNode *rt) :root(rt) {};
~BinStrTree() {
delete root;
}
private:
TreeNode * root;
};
这是我的测试代码
TreeNode root("root", 1);
TreeNode left("left", 2);
TreeNode right("right", 3);
root->add_left(&left);
root->add_right(&right);
{
BinStrTree btree(&root);
}
结果就是析构不了,invalid memory block之类的,查了下,原来delete只能作用于动态分配的内存上,也就是分配在堆上的对象,而不能作用于栈上的对象。如此,把测试对象都改成动态分配的对象就ok了。
TreeNode *root=new TreeNode("root", 1);
TreeNode *left=new TreeNode("left", 2);
TreeNode *right=new TreeNode("right", 3);
root->add_left(left);
root->add_right(right);
{
BinStrTree btree(root);
}
本文通过修改测试代码中的对象分配方式,解决了二叉树类在进行深拷贝时遇到的析构函数错误问题。
17万+

被折叠的 条评论
为什么被折叠?



