复制构造函数和析构函数octree c ++

时间:2016-05-16 17:22:38

标签: c++ destructor copy-constructor octree

我已经创建了一个八叉树数据结构,但它还不完美。我挣扎着复制构造函数和析构函数。 这是我的头文件:

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

构造函数,析构函数,复制contrsuctor

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

以下是我在main中创建对象的方法:

int main() {

Octree tree;
Octree tree2(tree);

tree.searchandset(8, 2);
tree2.Print(tree2.search(8));
return 0;
}

searchandset函数中,我在第一棵树上给出节点号8的值。之后,我调用复制构造函数并打印第二个树的第8个节点。该值与我为第一个树提供的值相同,但是当析构函数调用I时总是出现此异常:

抛出异常:读取访问冲突。 节点是0xDDDDDDDD。

据我所知,这意味着我试图删除已删除的节点。对象&#39; tree2&#39;是一个与树不同的对象&#39;具有相同的值和节点不是吗?然后我不理解上面的例外情况。 我是c ++的新手,我知道它是基本的东西,所以如果有人指导我走向正确的方向,我会非常感激。

1 个答案:

答案 0 :(得分:1)

问题出在copy函数中。让我们一步一步:

node* n2 = new node;

if (n) {
    for (int i = 0; i < 8; i++)
        n2->child[i] = copy(n->child[i]);
}
return n2;

对于使用默认构造函数构造的空Octree oct,并复制到另一个Octree

  1. 创建了新的noden2
  2. nroot的{​​{1}},因此条件为oct
  3. true的{​​li> child[i]的值为相应孩子的n2,因此请再次致电copy
  4. 创建新节点copy
  5. n2n(因为nullptr中所有nullptr的孩子都在这里,所以不执行条件
  6. 返回oct
  7. 重复步骤n23 8次
  8. 返回根6
  9. 将新指针(n2)分配给复制对象的n2
  10. 但是等等!您是否注意到在步骤6中,即使孩子应该是root,您也return了一个新指针!

    这就是问题,因为在nullptr中,你将遍历每个孩子。那还可以,对吗?但是,您尝试访问未初始化的子项(它们具有随机值,条件将评估为clear),因此您获得true,因为它不是您的记忆

    那么解决方案?如果Read access violation不是n2,则仅为n分配内存。