C C 記憶體管理一點問題

2021-04-01 22:33:31 字數 862 閱讀 4391

1.常見的記憶體錯誤及其對策

*記憶體未分配成功卻使用了它:

在使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查 ;如果使用malloc或者new來申請記憶體,應該用if(p==null)或if(p!=null)進防錯處理。

*無論用何種方式建立陣列,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。

*記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。

*記憶體洩露。動態記憶體的申請與釋放必須配對,申請與釋放的次數一定要想同。

*釋放了記憶體卻繼續使用它(三種情況):

(1)物件呼叫關係過於複雜。應重新設計資料結構,解決物件管理混亂局面

(2)函式注意不要返回指向「棧記憶體」的「指標」或者「引用」,該內存在函式體結束時會被銷毀

(3)使用free或delete釋放了記憶體後,沒有將指標設定為null。導致產生「野指標」。  

2.指標與陣列的對比

*陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在宣告週期內保持不變,只有陣列的內容可以改變。

3.修改內容

企圖修改常量字串的內容導致執行錯誤。

4.內容複製與比較

對陣列進行複製:strcpy();

對陣列進行比較:strcmp();

//指標

int len=strlen(a);

char *p=(char *)malloc(sizeof(char)*(len+1));

strcpy(p,a);              //不要用p=a,

if(strcmp(p,a)==0)  //不要用if(p==a),那是比較位址

關於C C 記憶體一點小知識

這裡室友拷了一段 過來除錯,這個過程中發現了一點由使用了未分配的記憶體造成的乙個問題,為此我花了一點時間來除錯問題的根源 如下 include include using namespace std int main if flag else return 0 答 破解上述加密的關鍵在於利用攻破st...

記憶體管理的一點事

引用計數 物件的每次建立,引用計數為1 方法 1 retain方法,每次呼叫引用計數加1,並且返回值是物件本身 2 release方法,物件引用計數減1,沒有返回值 3 retaincount方法,返回物件的引用計數 4 dealloc方法,當乙個物件被 的時候,會呼叫此方法,像是物件說臨終遺言的地...

一點小問題

header content type text html charset utf 8 fp fopen c 1.doc r fp1 fopen r fclose fp fclose fp1 filename c 33.txt 可能很多時候錯誤都不是在本行 fp3 fopen filename r ...