【问题标题】:C++ Segfault on clearing a binary search treeC++ Segfault 清除二叉搜索树
【发布时间】:2011-10-06 01:27:02
【问题描述】:

我正在尝试消除我正在制作的二进制搜索树中的任何内存泄漏,因此我制作了一个简单的递归删除方法。这是首先导致的方法

void BST::copy(const BST& other){

    if (other.root != NULL){
        Clear();

哪个Clear(); 将首先调用recursiveDelete(root);

void BST::recursiveDelete(BSTNode * head){

    if (head == NULL)
        return;
    recursiveDelete(head->left); 
    recursiveDelete(head->right);
    delete head;
}

这段代码会出现段错误,我不知道为什么。当它调用 copy 方法时,它只有一个节点,所以它说 head 不像预期的那样为 NULL,但由于某种原因,当它试图引用 head->left 时,它会出现段错误。

任何帮助将不胜感激。 :)

编辑:直到其中一位回答的人指出,我才知道这一点,但在复制构造函数中,需要先将所有内容初始化为 NULL,然后再尝试复制。所以当我将构造函数更改为以下时,我的问题(大部分)得到了解决

BST::BST(const BST & other) : root(NULL), size(0){

【问题讨论】:

  • 这个有问题的head是在哪里创建的?

标签: c++ segmentation-fault


【解决方案1】:

第一条评论:如果另一个对象有数据或没有数据,您可能应该清除副本中的对象数据。如果另一个对象为空,则副本也应使该对象为空。

第二条评论:我无法从您的问题中看出,但我希望在构造过程中 head->left 或 head->right 没有正确设置为 NULL。无效但非 NULL 值将解释通过 if (head == NULL) 检查。

【讨论】:

    【解决方案2】:

    在 BST::copy 中,您对 NULL 的检查与调用 Clear() 不在同一个对象上,这似乎很奇怪。我没有足够的代码可以肯定地说,但它不应该是:

    if (root != NULL) {
        Clear();
    }
    

    那么您可能还需要检查 other.root != NULL 以获取您尚未发布的后续代码。

    但作为一般规则,Clear() 应该可以安全地调用任何一种方式。您应该简单地检查 Clear() 中的 NULL。

    【讨论】:

      【解决方案3】:

      试试看

      delete head;
      
      head = NULL;
      

      并确保在构造函数中将 left 和 right 设置为 NULL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多