C ++如何释放内存
c++ how to free memory
我有以下问题:
我使用名为 Node.js 的 class 创建了一个数据结构来表示二叉搜索树。每个节点都通过指向左 child 和右 child.
的指针连接
将要构建的树非常大(最多 100 万个节点),因此我需要一种方法在每次构建树后释放内存。
树由指向根节点的指针表示:
BST_Node *bst = new BST_Node(...);
我试过 delete bst
和创建 destructor
~BST_Node(){delete left; delete right;}
但它们都没有解决问题。
内存使用率达到 99% (8GB) 然后我必须终止进程以避免 PC 重启。
我该如何解决?谢谢
在 C++ 中,此代码:
BST_Node *bst = new BST_Node(...);
应该写成:
auto bst = std::make_unique<BST_Node>(...);
这将创建 bst
作为 unique_ptr<BST_Node>
对象。 unique_ptr
是一个 智能指针 class。智能指针在超出范围时会自动销毁底层对象。这使您不必自己调用 delete。
这种类型的代码不仅更容易编写,因为您不必记得自己调用 delete,而且 唯一 编写代码的方法不会如果抛出异常,则会泄漏内存。
BST_Node
的成员变量应该使用相同的unique_ptr
。
而且,除非您正在学习 二叉搜索树,否则您应该使用 std::set
class 而不是自己构建。 std::set
实现为二叉搜索树(一般是红黑树,是二叉搜索树的变种)。
哈希映射也可能比二叉搜索树更有效。 C++ 中的哈希映射称为 std::unordered_map
.
我有以下问题: 我使用名为 Node.js 的 class 创建了一个数据结构来表示二叉搜索树。每个节点都通过指向左 child 和右 child.
的指针连接将要构建的树非常大(最多 100 万个节点),因此我需要一种方法在每次构建树后释放内存。
树由指向根节点的指针表示:
BST_Node *bst = new BST_Node(...);
我试过 delete bst
和创建 destructor
~BST_Node(){delete left; delete right;}
但它们都没有解决问题。
内存使用率达到 99% (8GB) 然后我必须终止进程以避免 PC 重启。
我该如何解决?谢谢
在 C++ 中,此代码:
BST_Node *bst = new BST_Node(...);
应该写成:
auto bst = std::make_unique<BST_Node>(...);
这将创建 bst
作为 unique_ptr<BST_Node>
对象。 unique_ptr
是一个 智能指针 class。智能指针在超出范围时会自动销毁底层对象。这使您不必自己调用 delete。
这种类型的代码不仅更容易编写,因为您不必记得自己调用 delete,而且 唯一 编写代码的方法不会如果抛出异常,则会泄漏内存。
BST_Node
的成员变量应该使用相同的unique_ptr
。
而且,除非您正在学习 二叉搜索树,否则您应该使用 std::set
class 而不是自己构建。 std::set
实现为二叉搜索树(一般是红黑树,是二叉搜索树的变种)。
哈希映射也可能比二叉搜索树更有效。 C++ 中的哈希映射称为 std::unordered_map
.