编程规范和技巧

内存泄露  时间:2021-01-16  阅读:()

编写高质量的C/C++程序一定要编写高质量代码!
高质量代码提高编程效率减少调试时间提高人品:代码是写给他人用的!
养成好习惯从点点滴滴做起不要光看不做程序员的境界大学计算机教育的失误:程序质量低下什么是编程老手:能够长期稳定地编写出高质量程序的程序员什么是编程高手:能够长期稳定地编写出高难度、高质量程序的程序员编程风格世上不存在最好的编程风格一切因需求而定团队开发讲究风格一致如果制定了大家认可的编程风格,那么所有组员都要遵守若某种编程风格比较合你的工作,那么就采用它,不要只看不做:养成习惯!

一流代码的特性鲁棒-SolidandRobustCode简洁-MaintainableandSimpleCode高效-FastCode简短-SmallCode共享-Re-usableCode可测试-TestableCode可移植-PortableCode一流代码关于代码风格问题代码风格(CodingStyle)是一种习惯现在许多大公司都对员工书写代码制定了规范开发大项目时由项目管理者制定代码规范程序风格的重要构成因素程序版式命名规则函数设计原则其他表达式规则与零比较常量规则动态数组内存管理程序版式程序版式——程序员的书法比书法好学得多,基本不需要特别练习但是坏习惯一旦养成,就像书法一样难以改变不影响程序的功能,但影响程序的可读性追求清晰、整洁、美观、一目了然容易阅读,容易测试程序版式不良的风格intisprime(intn){intk,i;if(n==1)return0;k=sqrt((double)n);for(i=2;i#includemain(){inti;for(i=2;i#includemain(){inti;for(i=2;ic)&&(b+c>a)&&(c+a>b))array[5]=0;不要写成array[5]=0;a.
Function(不要写成a.
Function();b->Function(不要写成b->Function();int*x=&y;良好的风格int*x=&y;不良的风格x=a=2000)良好的风格if(year>=2000)不良的风格if((a>=b)&&(c=b&&c=veryLongVar2)&&(veryLongVar3>=veryLongVar4)){DoSomething();}doubleFunctionName(doublevariablename1,doublevariablename2);for(very_longer_initialization;very_longer_condition;very_longer_update){DoSomething();}程序版式修饰符*和&的位置有争议从语义上讲,靠近数据类型更直观,但对多个变量声明时容易引起误解int*x,y;提倡靠近变量名int*x,y;注释规范注释(Comments)的重要性写注释给谁看在哪些地方写注释怎样写注释注释的风格写注释时的注意事项可灵活运用的一些规则注释规范注释的重要性注释对于程序犹如眼睛对于人的重要性一样没有注释的程序对于读者好比眼前一团漆黑,跟拿到一个可执行程序别无二致不规范的注释和好几千度的近视眼没什么区别代码本身体现不出价值开发程序的思维才能使其变得有价值这种思维的具体体现就是在于注释和规范的代码本身注释规范写注释给谁看给自己看,使自己的设计思路得以连贯给继任者看,使其能够接替自己的工作注释规范写注释的最重要的功效在于传承要站在继任者的角度写简单明了、准确易懂、防止二义性让继任者可以轻松阅读、复用、修改自己的代码让继任者轻松辨别出哪些使自己写的,哪些是别人写的注释规范不好的注释i=i+1;//i加1return-1;返回-1free(p);//释放p所指的内存fclose(fin);//关闭文件/功能描述:本函数用于实现xxx功能,目的是:*//*入口参数:参数p,表示指向结构体的指针*//*出口参数:参数xx,表示*//*返回值:返回xx值,当返回xx值时,表示注释规范不好的注释不但白写,还扰乱了读者的视线/*以二进制只读方式打开文件并判断打开是否成功*/if((fin=fopen("cat.
pic","rb")==NULL){puts("打开文件cat.
pic失败");/*如果打开失败,则显示错误信息*/return-1;返回-1*/}……/*从图像的第1行到第400行循环*/for(i=0;i=-EPS)&&((x<=EPS))if(fabs(x)<=EPS)与零比较的规则指针变量与零比较不应写成if(p==0)//容易误解为整型变量if(p!
=0)if(p)容易误解为布尔变量if(!
p)应写成if(p==NULL)//强调p是指针变量if(p!
=NULL)常量规则尽量使用含义直观的常量来表示多次出现的数字或者字符串#definePI3.
14159constfloatPI=3.
14159;C++中用const常量完全取代宏常量需要对外公开的常量集中放在一个公共的头文件中,不需要对外公开的常量放在定义文件的头部常量规则怎样建立在类中恒定,且仅在类中有效的常量#define定义的宏常量是全局的const数据成员可以吗常量规则classA{…constintSIZE=100;//不能在类声明中初始化const数据成员intarray[SIZE]类的对象未被创建时,SIZE值未知};const数据成员只能在类构造函数的初始化表中进行classA{…A(intsize)构造函数constintSIZE;};A::A(intsize):SIZE(size){…}Aa(100);//对象a的SIZE值为100Ab(200);//对象b的SIZE值为200常量规则怎样建立在整个类中都恒定的常量呢const数据成员只在某个对象生存期内是常量,而对类而言是可变的因为类可以创建多个对象不同对象的const数据成员值不同不能指望const数据成员了常量规则怎样建立在整个类中都恒定的常量呢应该用类中的枚举常量来实现classA{…enum{SIZE1=100,SIZE2=200};//枚举常量intarrayA[SIZE1]intarrayB[SIZE2];};缺点:隐含数据类型是整数,其最大值有限,且不能表示浮点数动态数组一维动态数组int*p=NULL;p=(int*)malloc(n*sizeof(int));…p[i]像使用一维数组一样使用…二维动态数组int*p=NULL;p=(int*)calloc(m*n,sizeof(int));…p[i*n+j]);//像使用一维数组一样使用…函数设计原则函数的功能要单一,不要设计多用途的函数函数的规模要小,尽量控制在50行代码以内1986年IBM在OS/360的研究结果:大多数有错误的函数都大于500行1991年对148,000行代码的研究表明:小于143行的函数比更长的函数更容易维护函数设计原则参数的规则参数要书写完整,不要省略参数类型和参数名没有参数时,用void填充参数个数尽量控制在5个以内参数名要恰当,顺序要合理voidMyStrcpy(char*str1,char*str2);voidMyStrcpy(char*dstStr,char*srcStr);如果参数是指针,且仅作输入用,则应在类型前加constvoidMyStrcpy(char*dstStr,constchar*srcStr);函数设计原则返回值的规则不要省略返回值的类型,可声明为void确保返回值与声明的类型一致,不要依赖自动类型转换不能返回指向栈内存的指针犯了释放内存以后还继续使用的错误函数设计原则函数内部实现的规则在函数的入口处,使用断言assert检查参数的合法性尽量少用全局变量,确保函数的单入口和单出口,不得不用时,要严格控制对它的改写,例如,几个有关联的函数需要使用全局变量时全局变量应和访问全局变量的函数放在单独的一个文件中,与其它文件分别编译并且将该全局变量声明为static(静态全局变量)尽量少用静态局部变量,以避免使函数具有"记忆"功能成对编码写函数体时先写上面的大括号然后马上就写下面的大括号最后再插入函数体内的代码动态申请内存时先分配一块内存然后马上就写释放这块内存的代码最后再在中间插入你要用这块内存做什么的代码所有变量要集中申请在函数的首部或块的首部按以上方法编程不仅能保证快速正确,而且不必等代码全部写完就可以调试其他不要过多假设不可能发生的情况总是会发生充分测试构造尽可能多的数据,变态的数据Codereview让别人看你的代码多看别人(高手)的代码处理错误机制返回错误信息异常处理活用断言ASSERT(),在debug版本多用,能发现很多隐含的bugs内存管理5.
1内存分配方式从静态存储区域分配.
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.
例如全局变量,static变量.

在栈上创建.
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.
栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.

从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.
动态内存的生存期由我们决定,使用非常灵活,但问题也最多.

5.
2常见的内存错误内存分配未成功,却使用了它.
内存分配虽然成功,但是尚未初始化就引用它.
内存分配成功并且已经初始化,但操作越过了内存的边界.
忘记了释放内存,造成内存泄漏.
释放了内存却继续使用它5.
3习惯规则用malloc或new申请内存之后,应该立即检查指针值是否为NULL.
防止使用指针值为NULL的内存.

不要忘记为数组和动态内存赋初值.
防止将未被初始化的内存作为右值使用.
避免数组或指针的下标越界,特别要当心发生"多1"或者"少1"操作.

动态内存的申请与释放必须配对,防止内存泄漏.
用free或delete释放了内存之后,立即将指针设置为NULL,防止产生"野指针".

5.
4free和delete的操作它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉.
指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了"野指针".
如果此时不把p设置为NULL,会让人误以为p是个合法的指针.

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if(p!
=NULL)进行防错处理.
很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块.

"野指针"示例5.
5动态内存会被自动释放吗指针消亡了,并不表示它所指的内存会被自动释放.
内存被释放了,并不表示指针会消亡或者成了NULL指针.
5.
6杜绝野指针"野指针"不是NULL指针,是指向"垃圾"内存的指针.
人们一般不会错用NULL指针,因为用if语句很容易判断.
但是"野指针"是很危险的,if语句对它不起作用.

"野指针"的成因主要有三种:指针变量没有被初始化.
任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气.

指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针.
指针操作超越了变量的作用范围.
这种情况让人防不胜防5.
7new/deleteMalloc/free是库函数,new/delete是运算符.
光用maloc/free无法满足动态对象的要求.
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete.

Hostodo:4款便宜美国vps七折优惠低至$13/年;NVMe阵列1Gbps带宽,免费DirectAdmin授权

hostodo怎么样?快到了7月4日美国独立日,hostodo现在推出了VPS大促销活动,提供4款Hostodo美国独立日活动便宜VPS,相当于7折,低至$13/年,续费同价。Hostodo美国独立日活动结束时间不定,活动机售完即止。Hostodo商家支持加密数字货币、信用卡、PayPal、支付宝、银联等付款。Hostodo美国独立日活动VPS基于KVM虚拟,NVMe阵列,1Gbps带宽,自带一个...

修罗云50元/月起香港大宽带NAT VPS,香港沙田建站2核2G5M仅70元/月起

修罗云怎么样?修罗云是一家国内老牌商家,修罗云商家以销售NAT机器起家,国内的中转机相当不错,给的带宽都非常高,此前推荐的也都是国内NAT VPS机器。今天,云服务器网(www.yuntue.com)小编主要介绍一下修罗云的香港云服务器,适合建站,香港沙田cn2云服务器,2核2G,5M带宽仅70元/月起,同时香港香港大带宽NAT VPS低至50元/月起,性价比不错,可以尝试一下!点击进入:修罗云官...

#推荐# cmivps:全场7折,香港不限流量VPS,支持Windows系统

cmivps香港VPS带来了3个新消息:(1)双向流量改为单向流量,相当于流量间接扩大一倍;(2)Hong Kong 2T、Hong Kong 3T、Hong Kong 无限流量,这三款VPS开始支持Windows系统,如果需要中文版Windows系统请下单付款完成之后发ticket要求官方更改即可;(3)全场7折年付、8折月付优惠,优惠码有效期一个月!官方网站:https://www.cmivp...

内存泄露为你推荐
yuming域名IP指向 是什么意思??租服务器租个一般的服务器大概多少钱啊?英文域名中文域名与英文域名有什么区别,中文域名为什么贵?在搜索时哪个更有优势美国服务器托管美国服务器租用有哪些系列?重庆虚拟空间重庆合川宝龙城市广场有前途么云南虚拟主机云南虚拟主机,公司网站用本地客户,云南数据港怎么样?广西虚拟主机江西服务器托管,但要接入专线,问了很多代理都说不可以,如何解决?shopex虚拟主机西部数码虚拟主机,适合做独立shopex或者echsop网店吗,我想开网店,推荐一下哪个型号的好域名邮箱如何注册域名邮箱解析域名网站上的域名解析是什么意思?
域名解析 购买域名 独享100m php主机 搜狗抢票助手 服务器维护方案 股票老左 vip购优惠 卡巴斯基免费试用版 ssl加速 sonya 免费的加速器 cloudflare 香港打折信息 连连支付 g6950 sockscap下载 中国最年轻博士 上海服务器托管 更多