复制构造函数和析构函数八叉树c++
Copy constructor and destructor octree c++
我已经创建了一个八叉树数据结构,但它还不完美。我一直在为复制构造函数和析构函数而苦恼。这是我的头文件:
class Octree
{
public:
static int lastbranch;
static bool utolsoelotti;
struct node
{
int value;
node *child[8];
};
Octree();
~Octree();
Octree(const Octree& oct);
void clear(node* node);
node* searchandset(int dec, int value);
node* search(int dec);
node* step(node *node, int k);
node* copy(node *n);
void Print(node *n)const;
void deletebranch(int branch);
node *root;
};
构造函数、析构函数、复制控制器
Octree::Octree()
{
root = new node;
root->value = 0;
for (int i = 0; i < 8; i++)
root->child[i] = 0;
}
Octree::~Octree()
{
clear(root);
}
Octree::Octree(const Octree& oct) {
root = copy(oct.root);
}
void Octree::clear(node *node){
for (int i = 0; i < 8; i++)
if (node->child[i])
clear(node->child[i]);
delete node;
}
Octree::node*Octree::copy(node *n) {
node* n2 = new node;
if (n) {
for (int i = 0; i < 8; i++) {
n2->child[i] = copy(n->child[i]);
}
}
return n2;
}
以下是我主要如何创建对象:
int main() {
Octree tree;
Octree tree2(tree);
tree.searchandset(8, 2);
tree2.Print(tree2.search(8));
return 0;
}
在searchandset
函数中,我为第一棵树上的节点编号8给定一个值。之后,我调用复制构造函数并打印第二个树的第8个节点。这个值与我为第一棵树给出的值相同,但当解构造器调用时,我总是得到这个异常:
引发异常:读取访问冲突。节点为0xDDDDDDDD。
正如我所知,这意味着我试图删除我已经删除的节点。对象"tree2"与具有相同值和节点的"tree"是不同的对象,不是吗?那么我不理解上面的例外情况。我是c++的新手,我知道这是基本的东西,所以如果有人能引导我朝着正确的方向前进,我会非常感激。
问题出在copy
函数中。让我们一步一步地进行:
node* n2 = new node;
if (n) {
for (int i = 0; i < 8; i++)
n2->child[i] = copy(n->child[i]);
}
return n2;
对于使用默认构造函数构造并复制到另一个Octree
:的空Octree oct
- 创建一个新的
node
,n2
n
是oct
的root
,因此条件为true
n2
的child[i]
具有对应子级的copy
的值,因此再次调用copy
- 创建新节点
n2
n
是nullptr
(因为oct
中的所有nullptr
都是子级),所以不执行条件- 返回
n2
- 重复步骤
3
至6
8次 - 返回根
n2
- 将新指针(
n2
)分配给复制对象的root
但是等一下!您注意到了吗,在步骤6中,您正在return
中创建一个新指针,尽管子指针应该是nullptr
!
这就是问题所在,因为在clear
中,您将遍历每个子级。还是可以的,对吧?但是,您尝试访问未初始化的子级(它们具有随机值,条件将计算为true
),因此您得到了Read access violation
,因为它不是您的内存。
那么解决方案?如果n
不是nullptr
,则仅为n2
分配内存。
相关文章:
- 从父数组测试用例构造二叉树失败
- 打印时有二叉树问题.用户输入不打印任何内容
- 试图找到二叉树的深度
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 指向二叉树中新节点的指针
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 在我的四叉树实现中遇到问题
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 二叉树级别顺序遍历在leetcode中
- 运行无限循环的最小二叉树问题
- 打印二叉树中的常见元素
- 二叉树基准测试结果
- 如何在C++中构造八叉树
- 复制构造函数和析构函数八叉树c++
- 使用八叉树在GPU中组织三维体积数据
- 如何将四叉树/八叉树用于块世界
- 穿上八叉树
- 当我尝试构建八叉树结构时堆栈溢出
- 三角形网格和粒子的八叉树实现
- 正在调用八叉树数组上的delete