【问题标题】:How to recursively delete a binary tree on visual C++ 2013?如何递归删除 Visual C++ 2013 上的二叉树?
【发布时间】:2015-03-01 15:26:42
【问题描述】:

以下代码在 Linux 上运行,但在 Windows 上崩溃:

#include <iostream>

struct Node
{
    Node()
        :data_(0), left_(nullptr), right_(nullptr)
    {   }

    int data_;
    Node* left_, *right_;
};

struct Tree
{
    Node* root_;

    ~Tree()
    {
        release(root_);
    }

    void release(Node* node)
    {
        if (node)
        {
            release(node->left_);
            release(node->right_);
            delete(node);
        }
    }
};

int main()
{
    {
        auto tree = Tree();
    }
    std::cout << "exit\n";
    return 0;
}

在使用 g++ 4.82 的 Ubuntu 14.04 LTS 上的输出:

退出

使用 Visual Studio 2013 在 Windows 8 上崩溃,抱怨如下:

访问冲突读取位置0xCCCCCCD0。

0x009A5CCC 处未处理的异常:0xC0000005:访问冲突读取位置 0xCCCCCCD0。

如何理解这个问题?如何解决?

【问题讨论】:

  • 你应该使用std::unique_ptr&lt;Node&gt;而不是Node*

标签: c++ visual-studio-2013


【解决方案1】:

Treeroot_ 成员未初始化。试图删除它是未定义的。

你应该在构造函数中初始化它:

Tree() : root_(nullptr) {}

【讨论】:

  • 你是对的..它现在正在工作。但为什么它在 Unbuntu 上工作?像在 Windows 上运行时检查之类的东西吗?
  • @YueWang 它也不能在 Ubuntu 上运行。它只是出现/假装正在工作。未定义的行为并不意味着“保证崩溃”。 (伙计,如果它这样做了!)
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多