【发布时间】: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&) = delete;和dynamicNode& operator=(const dynamicNode&) = delete;添加到您的班级即可。 -
从我们看来没有问题。但是,我们不知道您在其他函数中正在做什么,以及您是否让某些节点未被引用并丢失在堆中导致内存泄漏。当涉及到内存泄漏时,问题并不总是析构函数。
-
@john
dynamicNode(const dynamicNode&) = delete;在 C++98 中是不允许的