1.3. 5杜絕“野指針”
“野指針”不是NULL指針,是指向“垃圾”內存的指針。人們一般不會錯用NULL指針,因爲用if語句很容易判斷。但是“野指針”是很危險的,if語句對它不起作用。 “野指針”的原因主要有如下幾種:
(1)指針變量沒有被初始化。任何指針變量剛被創建時不會自動成爲NULL指針,它的缺省值是隨機的,它會亂指一氣。所以,指針變量在創建的同時應當被初始化,要麼將指針設置爲NULL,要麼讓它指向合法的內存。例如
char *ip = NULL;
char *ip = new char;
(2)指針ip被free或者delete之後,沒有置爲NULL,讓人誤以爲ip是個合法的指針。
(3)指針操作超越了變量的作用範圍。這種情況讓人防不勝防,示例程序如下:
- class A
- {
- public:
- void Func(void){ std::cout << “Func of class A” << std::endl; }
- };
- void Test(void)
- {
- A *p;
- {
- A a;
- p = &a; // 注意 a 的生命期
- }
- p->Func(); // p是“野指針”
- }
函數Test在執行語句p->Func()時,對象a已經消失,而p是指向a的,所以p就成了“野指針”。但奇怪的是有些編譯器運行這個程序時居然沒有出錯,這可能與編譯器有關。
1.3.6指針參數是如何傳遞內存的?
如果函數的參數是一個指針,不要指望用該指針去申請動態內存。見如下例子:
- void GetMemory(char *ip, int num)
- {
- ip = (char *)malloc(sizeof(char) * num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str, 100); // str 仍然爲 NULL
- strcpy(str, "hello"); // 運行錯誤
- }