幾個小例子--memory leak
阿新 • • 發佈:2019-01-23
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;