这是我的Node结构的正确析构函数吗?

时间:2016-07-28 18:20:52

标签: c++ destructor

我有这个C ++结构:

struct Node {
    char symbol;
    unsigned int index;
    vector<Node*> next;

    // Constructors
    Node():symbol('$'), index(0), next(0) {}
    Node(char &c, const unsigned int &ind):symbol(c), index(ind), next(0) {}

    // Add a new character
    Node* add(char &c, const unsigned int &num) {
        Node *newChar = new Node(c, num);
        next.push_back(newChar);
        return newChar;
    }

    // Destructor
    ~Node() {
        for (int i = 0; i < next.size(); i++)
            delete next[i];
    }
};

(我知道把它作为一个班级可能会更好,但让我们考虑它就好了)。

我不太确定我是否为此编写了正确的析构函数。在主要功能中,我使用根节点:

Node *root = new Node();

1 个答案:

答案 0 :(得分:6)

虽然代码不会泄漏内存(只要你delete中的main根节点new),它就不是最佳的。

您应该避免使用deleteunique_ptr,而应选择智能指针。在这种情况下,请使用Node root; // use root normally

另外,不要在堆上创建根节点,只需像以下那样正常创建它:

unique_ptr

您也没有正确遵循五条规则,如果您使用c,则甚至不需要担心,因为您没有自定义dtor。也没有理由按indref const refstruct Node { char symbol; unsigned int index; vector<std::unique_ptr<Node>> next; // Constructors Node():symbol('$'), index(0){} Node(char c, unsigned int ind):symbol(c), index(ind) {} // Add a new character Node* add(char c, unsigned int num) { next.push_back(std::make_unique<Node>(c, num)); return next.back().get(); } }; ,只是按值传递它们(因为你甚至不更改它们,而且价格便宜通过ref传递基元的值。)

通过这些更改,代码看起来像这样

{...
"permissions": [
    "http://random.com/"
    ],
}