內存管理是個比較複雜的東西,我這裏記錄一些比較重要的筆記。
0.永遠保持謙虛的態度來使用指針和操作內存。
1.在用free釋放內存後,要記得將指針賦值爲NULL,防止產生"野指針"。
2.儘量不要用指針指向常量字符串。看一個小例子:
char *p="abcde"; p[0]='m'; std::cout<<p<<std::endl;
用gcc編譯會出現警告:warning: deprecated conversion from string constant to ‘char*’.然後試着運行本程序,會出現:bus error.
常量字符串,那就必然是一個常量,就必然不能被更改。但是如果是用指針來引用常量字符串,就很容易將p指針與其他指向malloc分配的內存的指針混淆,造成比較難以發現的錯誤。如果必須要用常量字符串,我比較喜歡放在棧中,在代碼中用命名來提示這是一個常量字符串,比如 char const_a[]="abcde";雖然這從本質上不是一個常量字符串,可能會有一些壞處,但我覺得這是解決這一點問題的方法之一。
3.我覺得指針與數組的一個很大的區別就是:int a[10];int *p;sizeof(a)與sizeof(p)的差別了。sizeof(a)是整個數組的字節數,而sizeof(p)是指針的大小,32位是4字節,64位爲8字節。
4.函數的參數如果是一個數組,那麼,可以理解爲數組退化成了指針。一個小例子:
void print(int a[10]) { cout<<sizeof(a)<<endl; } int main() { int a[10]; print(a); return 0; }
輸出的值永遠是sizeof(char *)。
5.當程序結束時,會釋放所有內存,包括在堆中的和在棧中的,以及在靜態存儲區的。
6.free(p)。如果p是NULL指針,那麼free對p無論操作多少次都不會處問題。如果p不是NULL指針,那麼free對p連續操作兩次就會導致程序運行錯誤。
7.new和delete在處理動態對象的時候,會分別自動調用對象的構造函數和析構函數,而malloc/free卻沒有這樣的功能。這是因爲malloc/free是庫函數而不是運算符。C++中可以通過重載運算符來爲new/delete添加功能,但是卻不能改變庫函數的作用(因爲編譯器沒有這樣的控制權限)。所以在進行動態對象的內存管理時,應該使用new/delete而不是malloc/free.
參考資料:http://www.360doc.com/content/06/0813/14/6878_180157.shtml
如果你覺得我的文章對你有幫助,請贊一下,非常感謝!