程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中一些容易被人忽略的東西 之一[內存的分配與釋放]

C語言中一些容易被人忽略的東西 之一[內存的分配與釋放]

編輯:關於C語言

題記: 最近在看一本C語言書,感覺挺不錯的,但書中有些錯誤。同時又發現了一些容易被自己或者大家都容易忽略掉的東西,於是記下來跟大家分享下,文中內容如有錯誤還望大家一定幫忙指出下,謝謝!   一、內存的分配與釋放 學過C語言的都知道,內存分配了用完之後是要釋放的,都是到malloc和calloc函數以及free函數。那麼分配了內存之後是不是真就free(pointer)這麼簡單呢? 這裡提及要注意的地方,參數pointer必須是調用malloc或calloc函數後返回的指針,而給free函數傳遞其它的值可能會造成死機或者結果是災難性的。重點是指針的值,而不是用來申請動態內存的指針本身。 可以看下代碼, 假如先前有void * p =malloc(sizeof(double)*6); 也有double * dp=(double *)(malloc(sizeof(double)*6)); 那麼此刻如果free(dp)就會出現不可預知的錯誤,free(p)是正確的, 若又p=dp,(或者p=(void *)dp),然後free(p)也是正確的   所謂災難性的無非就是釋放內存中出現把不該釋放的東西給釋放了,然後引起了一些問題。 那麼,怎麼來驗證free(dp)就是錯誤的呢?這也許是個內存洩露的問題,呵呵。 可以試下這樣一段代碼: for(;;) { double * p=malloc(sizeof(double)*6); free(p); } 然後,看看你的內存是否超支(不夠)了?   再看看realloc函數,它可以用來重新分配經m,c,r三者分配的內存。那麼重新分配真的是給一塊新的地址嘛? 事實上並不是這樣的,r有兩個參數,一個是指針,引用之前分配的內存,重新分配的內存是在原來基礎之上,大小則由第二個參數決定。也就是說,如果你家庭總收入6000元,總管(通常是母的)給兒子分配了1000元的零花錢,現在由於一些"不可抗力"因素,要重新分配money,那麼,傳遞參數realloc(1000元的地址,newsize),newsize<=1000U。而本質上是將兒子手中的money根據newsize抽走一部分,然後剩下的會做一些處理。   動態內存分配的一些原則: 1、需要時分配,用完就釋放,特別是堆上的(資源很有限)。 2、避免分配大量小塊內存,因為堆上內存的分配由於有系統開銷,所以分配許多的小內存比分配幾塊大內存開銷要大,而已不便於釋放和管理。 3、編程的時候始終把用戶有限的內存放在心上,分配了就要考慮在哪裡釋放。 4、循環中分配內存一定要小心翼翼 5、釋放內存之前,確保不會無意中覆蓋堆上分配的內存地址,否則會出現內存洩露  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved