C++中的内存泄漏以及如何避免?

2021年3月15日09:36:13 发表评论 861 次浏览

当程序员使用分配内存时, 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通过激烈的问题解决过程来训练和掌握这些概念。


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: