当程序员使用分配内存时, C ++中会发生内存泄漏
new关键字
并忘记使用delete()函数取消分配内存
delete []运算符
。在C ++中, 使用错误的delete运算符是发生内存泄漏最多的原因之一。
应该使用delete运算符释放单个分配的内存空间, 而应该使用delete []运算符释放数据值的数组。
内存泄漏的缺点:
如果程序存在内存泄漏, 则由于所有系统的内存量有限且内存成本高昂, 因此其内存使用量会增加。因此, 它将产生问题。
C ++中的内存泄漏示例
// Program with memory leak
#include <bits/stdc++.h>
using namespace std;
// function with memory leak
void func_to_show_mem_leak()
{
int * ptr = new int (5);
// body
// return without deallocating ptr
return ;
}
// driver code
int main()
{
// Call the function
// to get the memory leak
func_to_show_mem_leak();
return 0;
}
如何避免内存泄漏?
- 与其手动管理内存, 不如尝试使用智能指针。
- 采用std :: string而不是char *。 std :: string类可在内部处理所有内存管理, 并且经过快速且优化良好。
- 除非使用原始指针与较旧的lib进行接口连接, 否则切勿使用。
- 避免C ++中内存泄漏的最佳方法是在程序级别上尽可能少地进行新的/删除的调用, 最好是NONE。任何需要动态内存的内容都应该埋在RAII对象中, 该对象会在超出范围时释放内存。 RAII在构造函数中分配内存, 然后在析构函数中释放它, 以便在变量离开当前作用域时保证将其释放。
- 通过new关键字分配内存, 并通过delete关键字释放内存, 并在它们之间编写所有代码。
处理内存泄漏的示例
// CPP program to
// illustrate how to avoid
// memory leak
#include <bits/stdc++.h>
using namespace std;
// function to see memory handling
void func_to_handle_mem_leak()
{
int * ptr = new int (5);
// body
// Now delete pointer ptr using delete
delete (ptr);
}
// Driver code
int main()
{
// Call function to handle
// the memory leak
func_to_handle_mem_leak()
return 0;
}
因此, 始终编写删除指针以匹配C ++中的新指针并始终按照上述示例中的说明在这些new和delete之间编写代码。在上面的示例中, 没有浪费内存, 因为当我们从函数中出来时, 我们通过使用delete函数来释放内存。
被认为是行业中最受欢迎的技能之一, 我们拥有自己的编码基础C ++ STL通过激烈的问题解决过程来训练和掌握这些概念。