【问题标题】:How should I define my destructor for the Node class in C++?我应该如何在 C++ 中为 Node 类定义我的析构函数?
【发布时间】:2022-01-03 15:25:11
【问题描述】:

我应该为由静态节点组成的树实现一类节点(出于教育目的)。类标题如下所示:

class CNodeStatic
{
private:
    int i_val;
    CNodeStatic *pc_parent_node;
    vector<CNodeStatic> v_children;
public:
    CNodeStatic() {i_val =0; pc_parent_node = NULL;};
    ~CNodeStatic();
    void vSetValue(int iNewVal) {i_val = iNewVal;};
    int iGetChildrenNumber() {return (v_children.size());};
    void vAddNewChild();
    void vAddChild(CNodeStatic pcChildNode);
    CNodeStatic *pcGetChild (int iChildOffset);
};
class CTreeStatic
{
private:
    CNodeStatic c_root;
public:
    CTreeStatic();
    ~CTreeStatic();
    CNodeStatic *pcGetRoot() {return (&c_root);};
    bool bMoveSubtree(CNodeStatic *pcParentNode, CNodeStatic *pcNewChildNode);
    void vPrintTree();
};

但是我不确定此类的析构函数应该是什么样子。我知道当类中有动态分配的内存或指针时,我们需要定义析构函数。在本例中,pc_parent_node 指向节点的父节点。但是,如果我尝试将我的析构函数仅定义为 delete pc_parent_node,则程序将无法运行。

【问题讨论】:

  • 代码sn-p中没有显示动态分配,所以不清楚你要删除什么
  • 应该是这样的:
  • 在使用delete之前检查指针是否真的指向分配的内存
  • @Ivan 你不能那样做。
  • 这样做的一个主要问题是添加一个孩子会使现有孙辈的父指针无效。

标签: c++ nodes destructor


【解决方案1】:

我知道当类中有动态分配的内存或指针时,我们需要定义析构函数

没错。如果一个类管理一个资源,它必须管理该资源并且清理是其中的一部分。

在这种情况下,pc_parent_node 指向节点的父节点。

指针 != 管理资源。特别是,不应该使用原始指针来管理生命周期。

显示的代码不会动态分配某些东西。该类似乎不拥有资源,因此它的析构函数中没有任何内容必须删除。如果它确实管理资源,它应该使用智能指针或容器来管理。

了解零规则 (https://en.cppreference.com/w/cpp/language/rule_of_three)。管理资源的类应该只做那个,不要做其他事情。在所有其他情况下,您应该通过将生命周期管理委托给智能指针或容器来努力遵循零规则。最好的析构函数是编译器可以生成的析构函数。仅当这还不够时,您才需要手动管理某些内容。

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 2021-10-31
    • 2020-12-15
    • 2020-09-25
    • 2013-01-19
    • 1970-01-01
    • 2015-08-07
    • 2016-09-24
    • 2022-06-10
    相关资源
    最近更新 更多