【发布时间】:2021-07-31 23:04:54
【问题描述】:
作为我的大学要求我完成的一项练习的一部分,我编写了一个小型 Graph 实现,遵循此标题。
class Node {
private:
std::string name;
std::vector<Node*> children;
public:
Node(const std::string& name="");
virtual ~Node();
}
在为析构函数~Node() 编写代码时,我注意到当图形包含循环时我的实现会失败。这是我目前的实现,如果图表包含循环,这显然不起作用。
Node::~Node() {
for (Node* n : children) {
delete n;
n = NULL;
}
children.clear();
}
我不确定如何最优雅地编写一个可以处理图中循环的析构函数?
请注意,我专门负责编写递归析构函数。 感谢您的回答!
【问题讨论】:
-
1.不要删除
~Node中的children。 2.让更高级别的函数/类来管理图中所有Nodes的销毁。 -
您的所有权似乎存在问题。您拥有共享所有权(多个对象可以具有指向同一个对象的指针,并且它们中的任何一个都可能负责
deleteing)以及潜在的循环所有权。这不是一个小问题。您应该更改您的所有权方案,将您的Nodes 存储在某种Graph对象中,并且只有Graph对象负责销毁它包含的每个Node。当指针拥有对象时,请记住使用unique_ptr而不是原始指针(std::unique_ptr<T>与T*)。 -
“请注意,我专门负责编写递归析构函数。”递归析构函数对于这类问题来说是一个非常糟糕的解决方案。
-
@FrançoisAndrieux “对于这类问题,递归析构函数是一个非常非常糟糕的解决方案”,如果问题是教所有权和递归析构函数的危险,则不是。大学是试验代码和理解选择的安全场所。你现在想解决这些问题,而不是在你有真正责任和真正后果的工作上。
-
@bolov 这仍然是一个糟糕的解决方案,即使它是一个糟糕的解决方案的好例子。 OP 现在知道这一点很好,以防他们不会在糟糕的解决方案不会产生实际后果的大学中学习它。
标签: c++ recursion graph c++14 destructor