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

📅  最后修改于: 2021-05-30 19:39:02             🧑  作者: Mango

当程序员使用new关键字分配内存而忘记使用delete()函数或delete []运算符取消分配内存时,在C++中会发生内存泄漏。在C++中,使用错误的delete运算符是发生内存泄漏最多的原因之一。
应该使用delete运算符释放单个分配的内存空间,而应该使用delete []运算符释放数据值的数组。

内存泄漏的缺点:
如果程序存在内存泄漏,则由于所有系统的内存量有限且内存成本高昂,因此其内存使用量会增加。因此,它将产生问题。

C++中的内存泄漏示例

// Program with memory leak
#include 
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 :: 字符串代替char *。 std ::字符串类在内部处理所有内存管理,并且它是快速且经过优化的。
  • 除非使用原始指针与较旧的lib进行接口连接,否则切勿使用。
  • 避免C++中内存泄漏的最佳方法是在程序级别上尽可能少地进行新的/删除的调用,最好是NONE。任何需要动态内存的内容都应该埋在RAII对象中,该对象会在超出范围时释放内存。 RAII在构造函数中分配内存,然后在析构函数中释放它,以便在变量离开当前作用域时保证将其释放。
  • 通过new关键字分配内存,并通过delete关键字释放内存,并在它们之间编写所有代码。

处理内存泄漏的示例

// CPP program to 
// illustrate how to avoid 
// memory leak
#include 
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++中新指针匹配的删除指针,并始终在这些新指针删除指针之间编写代码。在上面的示例中,没有浪费内存,因为当我们从函数出来时,我们通过使用delete函数来释放内存。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”