【发布时间】:2020-08-08 21:57:45
【问题描述】:
我有一个有 2 个布尔值和一个指针数组的类,我在堆上分配。问题是当它调用析构函数时它给了我一个错误,可能是因为它删除了太多,我看到它试图访问 0xdddddd并向我展示这个“抛出异常:读取访问冲突。 这是 0xDEEEDEEF。”
1.如何更好地使用“删除”,是不是因为操作符重载?
2.还说我没有初始化“QuadTree::childs”,为什么?
class QuadTree {
public:
QuadTree* childs[4];
bool info;
bool parent;
QuadTree() {
for (int i = 0; i < 4; ++i) {
childs[i]=NULL;
}
info = false;
parent = false;
}
~QuadTree() {
for (int i = 0; i < 4; ++i) {
delete childs[i];
}
}
QuadTree& operator=(const QuadTree& tree) {
for (int i = 0; i < 4; ++i) {
childs[i] = new QuadTree;
if (tree.childs[i]->parent == 1) {
childs[i] = tree.childs[i];
}
childs[i]->info = tree.childs[i]->info;
childs[i]->parent = tree.childs[i]->parent;
}
return *this;
}
}
所以这是添加两棵树的代码。我创建了重载运算符的下一个原因,如果一棵树的节点是白色的,另一个是父节点,我只想复制父节点。
void addTrees(const QuadTree& tree1, const QuadTree& tree2, QuadTree& end) {
if (tree1.info == 1 || tree2.info == 1) {
end.info = 1;
return;
}
else if (tree1.parent == 1 && tree2.parent == 1) {
end.parent = 1;
for (int i = 0; i < 4; ++i) {
end.childs[i] = new QuadTree;
addTrees(*tree1.childs[i], *tree2.childs[i], *end.childs[i]);
}
}
else if (tree1.parent == 1) {
end.parent = 1;
end = tree1;
}
else if (tree2.parent == 1) {
end.parent = 1;
end = tree2;
}
else {
end.info = 0;
}
}
【问题讨论】:
-
在构造函数中,您没有在堆上分配内存。这就是为什么在调用析构函数时没有要释放的内存。
-
也许,值得一提的是Rule of Three。通过重载复制分配,您还应该提供自定义复制构造函数。
-
也许,值得一提的是
info和parent的含义。我想知道在您的复制作业中检查孩子parents。实际上,tree是他们的父母,您将被传递到复制作业中。那么,没有父母怎么会有孩子呢? -
那么 info 的意思是,节点是黑色还是白色(0 表示白色,1 表示黑色),parent 的意思是它是结束还是继续成为另一个 QuadTree。问题是我尝试添加两棵树成为一棵树,我将添加添加树的代码。
标签: c++ memory heap-memory destructor