删除关键字c++
Delete keyword c++
我有一个 class,它有 2 个布尔值和一个指针数组,我在 heap.The 上分配了问题是当它调用析构函数时它给我一个错误,可能是因为它删除了太多,我看到它试图访问 0xdddddd 并向我显示此“抛出的异常:读取访问冲突。
这是 0xDEEEDEEF。"
1.How 我用 "delete" 更好吗,是因为运算符重载吗?
2.Also 说我没有初始化 "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;
}
}
所以这是添加两个的代码 trees.I 为下一个原因创建了重载运算符,如果一棵树的节点是白色的而另一个是父节点,我只想复制父节点。
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;
}
}
第 childs[i] = tree.childs[i];
行与您认为的不同。
您现在引用的是他们分配的内存,不再引用您分配的内存。谁想秒删这段记忆,谁就惨了。
如果您想将它们的 child 复制到您最近分配的 child 中,您将需要取消引用指针以对 object 本身进行操作。 *childs[i] = *tree.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;
}
};
在这些行中:
if (tree.childs[i]->parent == 1) {
childs[i]->info = tree.childs[i]->info;
childs[i]->parent = tree.childs[i]->parent;
childs[i]
可能是一个 nullptr
可以赋值但不能取消引用。
并且使用 ->parent
你可以取消引用 nullptr
取消引用前请检查 nullptr
。
我有一个 class,它有 2 个布尔值和一个指针数组,我在 heap.The 上分配了问题是当它调用析构函数时它给我一个错误,可能是因为它删除了太多,我看到它试图访问 0xdddddd 并向我显示此“抛出的异常:读取访问冲突。 这是 0xDEEEDEEF。"
1.How 我用 "delete" 更好吗,是因为运算符重载吗?
2.Also 说我没有初始化 "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;
}
}
所以这是添加两个的代码 trees.I 为下一个原因创建了重载运算符,如果一棵树的节点是白色的而另一个是父节点,我只想复制父节点。
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;
}
}
第 childs[i] = tree.childs[i];
行与您认为的不同。
您现在引用的是他们分配的内存,不再引用您分配的内存。谁想秒删这段记忆,谁就惨了。
如果您想将它们的 child 复制到您最近分配的 child 中,您将需要取消引用指针以对 object 本身进行操作。 *childs[i] = *tree.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;
}
};
在这些行中:
if (tree.childs[i]->parent == 1) {
childs[i]->info = tree.childs[i]->info;
childs[i]->parent = tree.childs[i]->parent;
childs[i]
可能是一个 nullptr
可以赋值但不能取消引用。
并且使用 ->parent
你可以取消引用 nullptr
取消引用前请检查 nullptr
。