如何在简单的树实现中使用智能指针

Vik*_*gar 0 c++ b-tree smart-pointers

这是B+树的一个节点。我想使用智能指针,因为我的程序泄漏了大量内存。如何使用智能指针转换代码?

class node
{

public:

    long* key;
    int capacity;
    node** nodes;
    node* parent;
    long* value;

    node ( int order ) {
        key = new long[order + 1];
        value = new long[order + 1];
        nodes = new node *[order + 2];
        capacity = 0;
        parent = NULL;
        for ( int i = 0; i <= order + 1; i++ ) {
            this->nodes[i] = NULL;
        }
    }
    ~node() {
        delete[] key;
        delete[] value;
        for ( int i = 0; i <= order + 1; i++ ) {
            delete nodes[i];
        }
    }

};
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

不要使用智能指针。聪明一点,不要使用指针,而是使用容器

#include <vector>

struct node
{
    std::vector<long>   keys;
    std::vector<long>   values;

    std::vector<node *> nodes;
    node *              parent;
};
Run Code Online (Sandbox Code Playgroud)

根据您的结构的限制,我什至可能希望制作parent一个node &(如果父级总是先出现并且从不改变),或者也许是一个std::reference_wrapper<node>. 但这只是一个小问题。)

  • 另请注意,在这个建议的解决方案中,某些内存仍必须手动管理(特别是“std::vector”内的“node*”),并且可以通过使用智能指针轻松简化:“std: :vector&lt;std::shared_ptr&lt;node&gt;&gt;`,可以与 `std::make_shared` 结合使用以减少分配的总数。另一个改进是使用键值对创建一个组合类型并保存其中的单个向量,这将进一步减少单独分配的数量。 (2认同)