c++ delete不能作用于栈上的对象

本文通过修改测试代码中的对象分配方式,解决了二叉树类在进行深拷贝时遇到的析构函数错误问题。

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);
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值