当程序员使用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等的更多准备工作,请参阅“完整面试准备课程” 。