##沒有躲過的坑--指針(內存泄露)
C++被人罵娘最多的就是指針。
夜深人靜的時候,拿出幾個使用指針容易出現的坑兒。可能我的語言描述有些讓人費勁,盡量用代碼說話。
**通過指向類的NULL指針調用類的成員函數**?
試圖用一個null指針調用類的成員函數,導致崩潰:
~~~
#include <iostream>
using namespace std;
class A
{
int value;
public:
void dumb() const {cout << "dumb()\n";}
void set(int x) {cout << "set()\n"; value=x;}
int get() const {cout << "get()\n"; return value;}
};
int main()
{
A *pA1 = new A;
A *pA2 = NULL;
pA1->dumb();
pA1->set(10);
pA1->get();
pA2->dumb();
pA2->set(20);//崩潰
pA2->get();
return 0;
}
~~~
為什么會這樣??
通過非法指針調用函數,就相當于給函數傳遞了一個指向函數的非法指針!?
但是為什么pA2->dumb()會成功呢??
因為導致崩潰的是訪問了成員變量!!
**使用已經釋放的指針**
~~~
struct X
{
int data;
};
int foo()
{
struct X *pX;
pX = (struct X *) malloc(sizeof (struct X));
pX->data = 10;
free(pX);
...
return pX->data;
}
~~~
**使用未初始化的指針**?
如果你這樣寫,編譯器會提示你使用了未初始化的變量p。
~~~
void fooA()
{
int *p;
*p = 100;
}
~~~
那么如果我釋放一個初始化的指針呢?
~~~
void fooB()
{
int *p;
free(p);
}
~~~
結果是一樣的!!
**釋放已經釋放的指針**?
直接看看代碼:
~~~
void fooA()
{
char *p;
p = (char *)malloc(100);
cout << "free(p)\n";
free(p);
cout << "free(p)\n";
free(p);
}
~~~
這樣的問題也許不會立即使你的程序崩潰,那樣后果更加嚴重!!
**沒有調用子類的析構函數**?
之前的博客講過,父類的析構函數最好聲明為虛!!
~~~
ParentClass *pObj = new ChildClass;
...
delete pObj;
~~~
上述代碼會造成崩潰,如果父類的析構函數不聲明為虛,那么不會調用繼承類的析構函數,造成內存泄露。
**內存溢出**?
當我們拷貝字符串的時候,我們常常會用到 memcpy函數。這里特別需要注意的就是字符串結尾的null字符:
~~~
char *p = (char *)malloc(strlen(str));
strcpy(p, str);
~~~
為了躲過這個坑,只需要把 strlen(str) 改為 strlen(str)+1。
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常