黃卓凡(河北省唐山市第一中學 河北 唐山 063000)
在C++編程中內存管理的第一步是內存分配。最為基本的分配方式是直接取出一定的固定內存,在固定內存上操作。為了防止溢出,這個固定內存必須要大于可能出現的最大需要。但是可能對于大部分問題,解決起來不需要那么多的內存。動態內存就是為了解決這個問題而被使用的。對于初學者來說,動態內存分配也是最容易出現問題的環節。比如:解引用null()指針;釋放已申請的非動態內存;操作內存越界;忘記檢查所請求的內存是否成功分配;只釋放動態分配的內存的一部分;繼續使用已被釋放動態內存。
注意:
(1)避免引用已申請但未初始化內存。注意賦予初值,即使是0。
(2)釋放操作對應的指針必須由calloc()、malloc()、realloc()等函數返回,其它函數指針可能導致程序立刻終止。注意進行非null判斷以確認。
(3)避免使用已釋放內存。注意在內存釋放后將指針設為null。
(4)注意malloc()、realloc()和calloc()三者的區別。如:malloc()不會對申請的內存初始化而calloc()會將分配的空間初始化為0等。
在C++代碼編寫過程中,多層嵌套是必不可少的。在多情況討論時的多重if()嵌套;在進行某些算法時的多重循環嵌套;多重函數嵌套等。對于初學者而言,使用多層嵌套可能會出現多種問題:
(1)在程序修改過程中可能會刪除一段程序,如果多刪除括號就會導致括號匹配錯誤。解決:將一對括號放在同一行或同一列,實時檢查當前括號是否符合邏輯關系。
(2)在多層循環嵌套時,對標記的初始化出現在錯誤循環層導致錯誤;循環順序錯誤導致錯誤.解決:仔細考慮循環中所需數據的變化情況并據此確定記錄數據應處位置。
(3)在多情況討論時,嵌套邏輯錯誤。解決:可以將多個邏輯判斷簡化如:
if(situation1()){
if(situation2()){
if(situation3()){
do();}}
}
簡化為
if(situation1()&& situation2()&& situation3()){do();}
(4)在多函數嵌套時,嵌套失誤。如并查集代碼:int getnode(int x){
if(node[x]==x)return x;return getnode(node[x]);}
通過路徑壓縮修改為
int getnode(int x){
if(node[x]==x)return x;
node[x]=getnode(node[x]);
return node[x];
}
增加代碼效率。
注意:
(1)要明確嵌套邏輯思路和實際的關系。(2) 善用 break,continue,return語句。
(3)程序設計上不推薦用goto語句,如果為簡化代碼使用goto時要注意goto的一些特殊性質。
C++語言在對變量的命名采用直觀且明確的方式,通過對程序編寫人員的提示有效的避免了由于命名混亂導致的程序錯誤,大大增加程序的可讀性。變量命名問題是初學者在編程過程中經常遇到的問題。對于個人編程而言,變量名可以根據自身需要自由使用,如“a”“b”“c”“a1”等。但是專業程序編寫界內有專業的命名法則:匈牙利命名法、帕斯卡命名法、小駝峰式命名法較為受歡迎。
(1)匈牙利命名法。微軟Windows系統環境最常用匈牙利命名法。匈牙利命名法使用小寫字母的符號標識作為變量名前綴,標識作用域、類型等。可以多個符號同時使用,順序是先成員變量、指針和簡單數據類型后其它。好處:能增加程序可讀性,便于程序編寫人員對程序的理解和維護。如:iMyDoc。
(2)小駝峰式命名法。駝峰命名混合使用大小寫字母--首字母小寫、其它單詞首字母大寫的方式命名函數和變量。如:printPay()。
(3)帕斯卡命名法。帕斯卡命名法與小駝峰式命名法十分相似,只是它單詞的第一個字母不是小寫而是大寫。如PrintData()。
注意:
(1)變量和函數名要清晰簡潔、單詞或單詞縮寫要讓大家基本能夠理解,避免產生誤解。
(2)函數命名要遵循動賓原則。
(3)避免單個字符變量名。
(4)定義標識符時盡量避免使用數字或不常用字符。
(5)同一項目中要有一致的命名風格。
初學者在學習運用C++編程時可能遇到很多問題,遇到問題時必須保持耐心,有些問題并非全部屬于技術上的難題,而是經驗不足、甚至是概念不清晰而產生的錯誤。希望本文的研究有利于提高初學者對程序錯誤的認識。