C/C++內存管理 筆記

     內存管理是個比較複雜的東西,我這裏記錄一些比較重要的筆記。
     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     
       如果你覺得我的文章對你有幫助,請贊一下,非常感謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章