黄卓凡(河北省唐山市第一中学 河北 唐山 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++编程时可能遇到很多问题,遇到问题时必须保持耐心,有些问题并非全部属于技术上的难题,而是经验不足、甚至是概念不清晰而产生的错误。希望本文的研究有利于提高初学者对程序错误的认识。