如何解决在C ++中删除树结构
我应该用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);
}
解决方法
可以简化析构函数,并且应该为索引使用正确的类型:
dynamicNode::~dynamicNode() {
for(size_t i = 0; i < children.size(); ++i)
delete children[i];
}
如果dynamicNode::addChild
抛出std::vector::push_back
或std::length_error
, std::bad_alloc
会泄漏内存。如果应用程序可以从这些异常中恢复,那可能是个问题。为避免内存泄漏的解决方法是:
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。