【问题标题】:Have I to call delete in this destructors?我必须在这个析构函数中调用 delete 吗?
【发布时间】:2014-01-28 15:31:55
【问题描述】:

我必须在这个类的析构函数中调用 delete 吗?

  1. 2 个指向节点的指针:

    class Node {
    private:
        char Ch;
        int Key;
        Node* L;
        Node* R;
    public:
        Node() { L = NULL; R = NULL; }
        Node(char, int, Node*, Node*);
        ~Node();
    };
    
  2. 指向节点的指针向量:

     class Example {
     private:
         vector<Node*> A;
     public:
         Node() {}
         Node(vector<Node*>);
         ~Node();
     };
    

在我项目的另一个类中,我通过“new”分配节点!

【问题讨论】:

  • 视情况而定。从您发布的代码中无法判断。
  • 我没有看到任何对“新”的调用。
  • 你的Example的成员函数应该是Example,而不是Node。 ... Stackoverflow 并不是要让其他人做你的工作:你尝试过什么,你有什么问题?
  • 在我项目的另一类中,我通过“new”分配节点!我不是要解决我的工作,我写了两个我不明白的案例。
  • 与往常一样,这取决于指针的分配方式以及谁负责它们的生命周期。

标签: c++ class destructor delete-operator


【解决方案1】:

如果您使用new 分配节点,那么您最终需要删除它们,例如vector 不会为您删除它们,它只会清除向量本身,但不会清除元素指向的内容(因为您有一个指针向量)。正如您所知道的那样,在您的类中建立节点的所有权可能有点棘手 - 应该删除哪个类?这就是为什么使用像 shared_ptr&lt;&gt;unique_ptr&lt;&gt; 这样的智能指针会让你的生活更轻松。

例如

std::shared_ptr<Node> L;
std::shared_ptr<Node> R;

std::vector<std::shared_ptr<Node>> A;

那么你就不用担心删除

【讨论】:

  • 谢谢。我有另一个问题。如果我有一个二叉树并且我想使用简单的指针,在我的类节点中,我必须在析构函数中为左右子节点调用 delete,它们是指向节点的指针。这样,当调用析构函数时,根不是子节点而是指向节点的指针,不会被删除,是吗?我还要为根调用另一个删除吗?
  • 恕我直言:这感觉像是一个递归问题,所以不是在节点内部删除,而是有一个清理函数递归地遍历树,从叶子开始删除。如果在 Node 内部删除,则必须让每个节点知道它们在树中的位置,例如我是根吗?如果你将来想说重新组织树,移动节点会更麻烦。
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 2013-06-27
  • 2018-06-02
  • 2014-11-22
  • 2013-06-25
  • 2013-03-09
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多