空指針
1.1. 0帶來的二義性問題
- C++03中,空指針使用“0”來表示。0既是一個常量整數,也是一個常量空指針。
- C語言中,空指針使用(void *)0來表示
- 有時候,用“NULL”來表示空指針(一種可能的實現方式是#define NULL 0)
1.2. C++標準化委員會希望“空指針”是一個確定的東西。
C++11中引入保留字“nullptr”作為空指針
示例:
void codeExample()
{auto x{ 10 }; //auto是類型推斷機制,通過x初始化的值來推斷x類型//相當于 int x=10;int* p = nullptr; //定義整型指針變量p,并初始化為空指針nullptrint* q{ nullptr }; //定義一個空指針,通過C++11初始化列表的方式賦值q = &x; //將x的地址賦值給q
}
動態內存管理:分配/釋放
2.1. C++中通過運算符new申請動態內存
new <類型名> (初值) ; //申請一個變量的空間
new <類型名>[常量表達式] ; //申請數組
如果申請成功,返回指定類型內存的地址;
如果申請失敗,拋出異常,或者返回空指針(nullptr)。(C++11)
2.2. 動態內存使用完畢后,要用delete運算符來釋放。
delete <指針名>; //刪除一個變量/對象
delete [] <指針名>; //刪除數組空間
int main()
{int* p = nullptr; //定義整型指針變量p,并初始化為空指針nullptrint* q{ nullptr }; //定義一個空指針,通過C++11初始化列表的方式賦值p = new int(42);q = new int[4];cout << "Before change, p =" << *p << endl;*p = 24;cout << "After change, p =" << *p << endl;for (int i = 0;i < 4;i++){*(q + i) = 10 + i;cout << *(q + i) << endl;}delete p;delete [] q;return 0;
}
在C++11中,還能使用0來代表空指針嗎?
答案:可以,因為需要向下兼容:
例如這樣:
int* p = 0;
int* q{ 0 };
new/delete 與 malloc/free 的區別是什么?
1、malloc與free是C++/C的標準庫函數,new/delete是C++的運算符,它們都可用于申請動態內存和釋放內存。
2、對于非內部數據類型的對象而言,只用malloc/free無法滿足動態對象的要求。對象在創建的同時,要自動執行構造函數,對象在消亡之前要自動執行析構函數。而由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free
總結:malloc/free是C/C++語言的標準庫函數,new/delete是C++的運算符 2.new能夠自動分配空間大小 3.對于用戶自定義的對象而言,用maloc/free無法滿足動態管理對象的要求。
3、malloc開辟空間的大小需自己計算,new是編譯器計算。4、malloc返回指針是void,需要強制轉換為對應類型的指針。new直接返回對應類型指針。
5、new/delete與malloc/free申請內存位置說明,malloc我們知道它是在堆上分配內存的,但new其實不能說是在堆上,C++中,對new申請內存位置有一個抽象概念,它為自由存儲區,它可以在堆上,也可以在靜態存儲區上分配,這主要取決于operator
new實現細節,取決與它在哪里為對象分配空間。