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的...