【问题标题】:c++ how to free memoryc++如何释放内存
【发布时间】:2020-09-10 08:13:42
【问题描述】:

我有以下问题: 我使用名为 Node 的类创建了一个数据结构来表示二叉搜索树。每个节点由指向左孩子和右孩子的指针连接。

将要构建的树非常大(最多 100 万个节点),因此我需要一种方法来在每次构建树后释放内存。

树由指向根节点的指针表示:

BST_Node *bst = new BST_Node(...);

我尝试使用delete bst 并创建destructor ~BST_Node(){delete left; delete right;},但它们都不能解决问题。 内存使用率达到 99% (8GB),然后我必须终止进程以避免 PC 重新启动。

我该如何解决?谢谢

【问题讨论】:

  • 变量在超出范围时被销毁,而不是被释放。 bst 已被破坏,但指针具有微不足道的析构函数(不执行任何操作)。
  • 不要使用原始指针。使用智能指针。它们会自动清理。

标签: c++ memory destructor delete-operator


【解决方案1】:

在 C++ 中,这段代码:

BST_Node *bst = new BST_Node(...);

应该写成:

auto bst = std::make_unique<BST_Node>(...);

这会将bst 创建为unique_ptr&lt;BST_Node&gt; 对象。 unique_ptr 是一个智能指针 类。智能指针一旦超出范围就会自动销毁底层对象。这使您不必自己调用 delete。

这种类型的代码不仅更容易编写,因为您不必记住自己调用 delete,而且它是编写在异常时不会泄漏内存的代码的唯一方法被抛出。

BST_Node 的成员变量应该使用相同的unique_ptr


并且,除非您正在学习二叉搜索树,否则您应该使用 std::set 类而不是构建自己的类。 std::set 实现为二叉搜索树(一般是红黑树,是二叉搜索树的一种变体)。

哈希映射也可能比二叉搜索树更有效。 C++ 中的哈希映射称为std::unordered_map

【讨论】:

    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2011-01-31
    相关资源
    最近更新 更多