【问题标题】:Deleting tree structure in C++ [closed]在 C++ 中删除树结构 [关闭]
【发布时间】:2020-11-10 21:16:51
【问题描述】:

我应该用 C++ 编写树的实现,但我在为这棵树中的 Node 编写析构函数时遇到了困难。我不确定它是否以适当的方式清除了整个结构。你能帮我解决这个问题吗? (我必须使用 C++98,也许它会解释在向量中存储原始指针)。

头文件:

class dynamicNode {

public:
    dynamicNode();
    ~dynamicNode();
    void setValue(int newValue);
    int getChildrenNumber();
    void addChild();
    dynamicNode* getChild(int index);
    void printValue();
    void printAllBelow();
private:
    dynamicNode* parent;
    std::vector<dynamicNode*> children;
    int value;



};

实现(我只包含了与树结构相关的方法):

dynamicNode::dynamicNode() {
    value = 0;
    parent = NULL;
}

dynamicNode::~dynamicNode() {
    if (!children.empty()) {
        for (int i = 0; i < children.size(); i++) {
            delete children.at(i);
        }
        children.clear();
    }

}

void dynamicNode::addChild() {
    dynamicNode* newChild = new dynamicNode();
    newChild->parent = this;
    children.push_back(newChild);
}

【问题讨论】:

  • 析构函数代码对我来说看起来不错。 (如果你愿意,你可以去掉 if (!children.empty()) 测试和 children.clear() 行,因为它们不是必需的,但它们也不会伤害任何东西)
  • 对我来说看起来不错,除了无法复制对象这一事实。所以要么你需要定义一个复制构造函数和一个赋值运算符。或者(更有可能)只是删除它们,这样您就不会意外复制。为此,只需将 dynamicNode(const dynamicNode&amp;) = delete; 和 dynamicNode&amp; operator=(const dynamicNode&amp;) = delete; 添加到您的班级即可。
  • 从我们看来没有问题。但是,我们不知道您在其他函数中正在做什么,以及您是否让某些节点未被引用并丢失在堆中导致内存泄漏。当涉及到内存泄漏时,问题并不总是析构函数。
  • @john dynamicNode(const dynamicNode&amp;) = delete; 在 C++98 中是不允许的

标签: c++ c++98


【解决方案1】:

析构函数可以简化,它应该使用正确的索引类型:

dynamicNode::~dynamicNode() {
    for(size_t i = 0; i < children.size(); ++i)
        delete children[i];
}

如果std::vector::push_back 抛出std::length_error 或std::bad_alloc,dynamicNode::addChild 会泄漏内存。如果应用程序可以从这些异常中恢复,这可能是一个问题。避免内存泄漏的修复方法是:

void dynamicNode::addChild() {
    std::auto_ptr<dynamicNode> newChild(new dynamicNode()); // Delete if children.push_back throws.
    newChild->parent = this;
    children.push_back(newChild.get());
    newChild.release();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2012-03-05
    相关资源
    最近更新 更多