1. 程式人生 > >幾個小例子--memory leak

幾個小例子--memory leak

C++程式設計師最害怕、最容易遇到的問題就是記憶體洩露,或是說非法訪問記憶體。

不想說太多的道理,就用幾個簡單的例子來詮釋。

指標超過作用域

void MemoryLeak( )
{
  int *data = new int;
  *data = 15;
}

在釋放前產生異常

void MemoryLeak() {
    int* ptr = new int;
    // do something which may throw an exception
    // we never get here if an exception is thrown
    delete ptr;
}

沒釋放就賦值nullptr

int * a = malloc(sizeof(int)); 
a = 0; //this will cause a memory leak

new/delete new[]/delete[] malloc/free沒有成對出現、沒有匹配

char *s = (char*) malloc(5); 
delete s;   //不能使用delete去釋放malloc分配的記憶體

釋放兩次,沒有賦為nullptr

char* pStr = (char*) malloc(20); 
free(pStr); 
free(pStr); // results in an invalid deallocation

返回局域變數的指標

MyClass* MemoryLeak()
{
  MyClass temp;
  return &temp;
}

使用已經釋放的指標

...
delete ptr;
ptr = nullptr;

ptr->show();

不要delete形參的指標

char* function( char* c)
{
  char* temp = new char [ strlen (c) + 1 ];
  strcpy ( temp, c );
  delete[] c; //錯誤,不應該刪除形參的指標
  return temp;//錯誤,返回局域變數的指標
}

使用了沒有分配記憶體的指標

MyWindow* window;
window->show();

delete非heap上的記憶體

MyWindow window;
delete window;