簡述malloc/free與new/delete的區別
malloc/free是C語言提供的庫函數,通過函數調用訪問,需要傳遞參數并接收返回值;而new/delete是C++的運算符,有自己的語法規則和運算方式。
malloc/free函數只能應用于基本類型,而new/delete不但可以應用于基本類型,還可以應用于面向對象的自定義類型。
malloc函數返回的是void*類型,程序需要顯示地轉換成所需要的指針類型;new操作符后面直接指明了類型,不涉及類型轉換問題。
malloc函數只負責申請空間,并返回首地址;new運算符除了申請空間,還會調用構造函數初始化指針指向的內容;free函數只負責釋放空間,并標識這段空間為可用空間;delete運算符除了釋放空間,還會調用對象的析構函數。
事實上,new/delete的功能已經完全覆蓋了malloc/free的功能,之所以C++中保留,是為了解決兼容問題,防止C++中調用含有malloc/free的C函數時出現錯誤。
簡述delete與delete[]的區別
當new[]中的數組元素是基本類型時,通過delete和delete[]都可以釋放數組空間;
當new[]中的數組元素是自定義類型時,只能通過delete[]釋放數組空間。
當數組中的元素是自定義類型時,delete在釋放空間只會調用數組中收割元素的析構函數,而delete[]在釋放空間時會調用數組中所有元素的析構函數。
建議申請和釋放空間采用完全配對的形式:new與delete成對使用,new[]與delete[]成對使用,而delete[]在釋放空間時會調用數組中所有元素的析構函數。
位運算
數據在計算機底層是以二進制的形式存儲的,位運算就是對內存中的二進制位進行操作。
(1)按位與:&,邏輯與操作的規則是有0為0,無0為1;
(2)按位或:|,邏輯與操作的規則是有1為1,無1為0;
(3)按位異或:^,邏輯與操作的規則是相同為0,不同為1;
(4)按位取反:~,1變為0,0變為1;
(5)左移:<<,將一個二進制數按照移位長度逐位向左移動若干位。左移過程中,高位逐漸移除,低位隨之補0;
(6)右移:>>,將一個二進制數按照移位長度逐位向右移動若干位。右移過程中,低位逐漸移除,高位隨之補0;
不使用臨時變量交換兩個數
可以使用位運算來實現不使用臨時變量交換兩個變量的值。具體實現如下:a = a ^ b;
b = a ^ b;
a = a ^ b;
其實是找了個虛擬的基準變量。
首先執行 a = a ^ b; 這一步是將 a 和 b 的值進行異或運算,并將結果賦給 a。異或運算的性質是:相同為0,不同為1。因此,a 的新值實際上是 a 和 b 的各個位不同的部分的組合。
然后執行 b = a ^ b; 這一步是將 a 和 b 的新值(即之前的 a ^ b)與原來的 b 進行異或運算,并將結果賦給 b。這一步的效果是將之前的 a 存儲在了 b 中。
最后執行 a = a ^ b; 這一步是將 a 的新值(即之前的 a ^ b)與 b 進行異或運算,并將結果賦給 a。這一步的效果是將之前的 b 存儲在了 a 中。