如何避免內存泄漏?(C++)

什麼是內存泄漏?

請看下面代碼。該代碼中的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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章