沒有躲過的坑 指標(記憶體洩露)

2021-07-06 10:31:14 字數 1276 閱讀 9547

c++被人罵娘最多的就是指標。

夜深人靜的時候,拿出幾個使用指標容易出現的坑兒。可能我的語言描述有些讓人費勁,盡量用**說話。

通過指向類的null指標呼叫類的成員函式

試圖用乙個null指標呼叫類的成員函式,導致崩潰:

#include 

using namespace std;

class a

void

set(int x)

intget() const

};int main()

為什麼會這樣?

通過非法指標呼叫函式,就相當於給函式傳遞了乙個指向函式的非法指標!

但是為什麼pa2->dumb()會成功呢?

因為導致崩潰的是訪問了成員變數!!

使用已經釋放的指標

struct x 

;int foo()

使用未初始化的指標

如果你這樣寫,編譯器會提示你使用了未初始化的變數p。

void fooa()

那麼如果我釋放乙個初始化的指標呢?

void foob()

結果是一樣的!!

釋放已經釋放的指標

直接看看**:

void fooa() 

這樣的問題也許不會立即使你的程式崩潰,那樣後果更加嚴重!!

沒有呼叫子類的析構函式

之前的部落格講過,父類的析構函式最好宣告為虛!!

parentclass *pobj = new childclass;

...delete pobj;

上述**會造成崩潰,如果父類的析構函式不宣告為虛,那麼不會呼叫繼承類的析構函式,造成記憶體洩露。

記憶體溢位

當我們拷貝字串的時候,我們常常會用到 memcpy函式。這裡特別需要注意的就是字串結尾的null字元:

char *p = (char *)malloc(strlen(str));

strcpy(p, str);

為了躲過這個坑,只需要把 strlen(str) 改為 strlen(str)+1。

沒有躲過的坑

今天偶然發現的問題,就是自己寫的win32程式安裝在c盤program files x86 資料夾下就會產生異常,而安裝在其他資料夾,即使是d盤的program files x86 下,程式也可以完美執行。引起這個,肯定是許可權的問題。這個軟體執行時,需要讀寫資料庫,以及各種快取資料。這就是我給自己...

沒有躲過的坑

工作中是這樣的,a類中有乙個成員變數x,最開始宣告為私有 class a 現在需要在另乙個cpp中使用這個x,所以要把它變為共有並且靜態 class a 由此可見 靜態資料成員和普通資料成員一樣遵從public,protected,private訪問規則。此時,編譯,我們會得到乙個錯誤,原因就是x沒...

沒有躲過的坑 重定義關鍵字

從學習程式語言開始,我們就知道變數或是函式的命名不能使用系統的關鍵字。但是有時候,你不得不這麼做。比如mac ios android windows共用乙個底層 這樣為了使底層更加通用,有時候就會忽略某種語言的某個關鍵字。也許關鍵字a對於win32就是乙個系統關鍵字,而a不是objective c的...