什麼是內存泄漏?
請看下面代碼。該代碼中的fuc_to_show_mem_leak()
在函數中申請了一個int
大小的內存,卻沒有在return
之前釋放它,從而導致了內存泄漏!
// 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 無需關心內存管理,它已經很好地在內部實現了內存管理。
- 無論如何都不要使用一個裸指針,除非逼不得已(比如要用它來指向一箇舊的庫)
- 在 C++ 中最好的避免內存泄漏的方式是儘量少的使用 new 和 delete 函數,最好是0使用。當你確實需要動態內存的時候,構造一個 RAII 類來在析構的時候自動地 delete 所有動態申請的內存。 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;
}
Note: 本文參考https://www.geeksforgeeks.org/memory-leak-in-c-and-how-to-avoid-it/