再探C++Primer (4)指針、引用、對象和內存

###基本內置類型和複合類型#程序員

基本內置類型就是算數類型和空類型,算數類型包括字符、整數、布爾值、浮點數,空類型是void;數據結構

複合類型指基於其餘類型定義的類型,例如指針和引用。函數

###引用#操作系統

  • 引用就是給對象起的別名,經過聲明對象時在對象標識符前加‘&’符號來定義引用類型。例如:int a=100;int &b=a;則能夠經過對b的操做來操做變量a;
  • 引用自己並非對象,只是對象的別名,在內存中沒有具體的存在;
  • 引用只與其初始化的對象綁定在一塊兒,初始化後不能將引用綁定到其餘對象上;
  • 引用只能綁定在對象上而不能綁定在表達式或字面值常量上。

###指針#指針

  • 指針同引用近似,提供了對其餘對象的間接訪問;
  • 指針是一個獨立的對象,容許對指針進行賦值和拷貝,定義指針後,根據計算機位數不一樣在內存中佔據不一樣的大小,例如32位計算機/32位編譯器中,指針大小是4字節;
  • 指針存儲的是對象在內存中的邏輯地址;
  • 指針能夠不被初始化也能夠在生命週期內指向多個對象。

####獲取對象地址、利用指針訪問對象#code

指針通常要求指針類型同其所指對象嚴格匹配對象

int a = 10;
int *b;
b = &a;				//經過取地址符獲取變量a地址
int c = *b;			//經過解引用符獲取指針b所指變量

double *d = a;		//錯誤,指針類型同所指對象不匹配

指針能夠不被初始化,經過取地址符&能夠獲取對象地址,經過解引用符*能夠獲取指針所指對象。遞歸

####指針值及一些好習慣#生命週期

指針值有四種類型:內存

  • 指向一個對象
  • 指向緊鄰對象所佔空間的下一個位置
  • 空指針,沒有指向任何對象
  • 無效指針,沒有指向有效對象

注意:無效指針不等於空指針,無效指針指向了一個未知的位置,而空指針爲0值,因此

int *a;
if (a)
	std::cout<<'1'<<endl;
else
	std::cout<<'0'<<endl;

將輸出爲1。

試圖以任何方式訪問無效指針都引起錯誤,編譯器不負責檢查此類錯誤,無效指針致使了大多數令咱們痛苦的bug和問題,因此應該養成初始化指針的好習慣。

若是沒法肯定指針的初值,那麼應該讓他們等於0或者NULL或者nullptr。

###對象和內存#

在C++中有如下5個內存分配區域:

  1. 。棧就是編譯器須要時分配,不須要時自動清理的變量的存儲區,這些變量一般是局部變量函數參數臨時變量等;
  2. 。堆就是由咱們new 出的對象的存儲區,編譯器無論他們的釋放,因此一般一個new 對應一個delete,若是程序員沒有釋放掉,那麼程序結束後操做系統自動回收。
  3. 自由存儲區。經過malloc 等分配的內存,他們和堆相似,可是使用free 來結束聲明並釋放;
  4. 全局/靜態存儲區全局變量靜態變量 的存儲區;
  5. 常量存儲區。顧名思義,存放常量 且不容許修改。

關於堆和棧的內容,屬於數據結構方面的,棧是一種先進先出的線性表,堆是一種樹形結構。

####內存泄漏和野指針#

內存泄漏

主要是指堆和自由存儲區內存泄漏,一般因爲new或者是malloc以後沒有delete或free掉,致使申請的對象空間在使用完畢後依然停留在內存中,特別是在局部new出的變量,因爲局部指針在脫離其做用域後已經失效,而申請的空間沒有釋放致使再也沒法釋放,就是內存泄漏。

內存泄漏會佔用內存空間,下降程序運行效率,特別是當內存泄漏的操做存在於高頻率執行的環境下,例如循環體或者遞歸中,那麼系統內存消耗將不斷增長,直到最終因沒有可分配內存而崩潰。

野指針

是指兩種狀況:

  1. 指針沒有初始化;
  2. 指針被free或delete後,沒有被置爲0或NULL或nullptr.

野指針被使用後,因爲編譯器不會檢查此類錯誤,因此每每容易形成咱們難以發現和理解的錯誤,因此

  1. 應該對指針進行初始化;
  2. 在free或delete指針後,將其置爲nullptr或NULL或0;
  3. 不要返回指向棧內存的指針或引用,由於棧內存在函數結束時會被釋放.
相關文章
相關標籤/搜索