C++ 如何释放内存
c++ how to free memory
我有以下问题: 我创建了一个数据结构,使用一个名为 Node 的类来表示二叉搜索树。每个节点都通过指向左子节点和右子节点的指针连接。
将要构建的树非常大(最多 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
是一个智能指针类。智能指针在超出范围时会自动销毁基础对象。这使您不必自己调用删除。
这种类型的代码不仅更容易编写,因为您不必记住自己调用 delete,而且这是编写在引发异常时不会泄漏内存的代码的唯一方法。
您应该对BST_Node
的成员变量使用相同的unique_ptr
。
而且,除非您正在学习二叉搜索树,否则您应该使用std::set
类而不是构建自己的类。std::set
实现为二叉搜索树(通常为红黑树,它是二叉搜索树的变体(。
哈希映射也可能比二叉搜索树更有效。C++中的哈希映射称为std::unordered_map
。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?