编程规范和技巧

内存泄露  时间: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.

A400:36元/季,16.8/月kvm架构,线路优质,延迟低

A400互联是一家成立于2020年的商家,主要推行洛杉矶服务器采用kvm架构,线路优质,延迟低,稳定性高!全场产品对标腾讯云轻量,服务器线路有有美国洛杉矶cn2_gia、香港cn2+cmi,目前推行的vps服务器均为精心挑选的优质线路机房,A400互联推出了夏季优惠洛杉矶5折、香港7折促销活动,质量可靠,价格实惠!二:优惠码洛杉矶五折优惠码:20210620香港cn2七折优惠码:0710三、优惠方...

buyvm迈阿密机房VPS国内首发测评,高性能平台:AMD Ryzen 9 3900x+DDR4+NVMe+1Gbps带宽不限流量

buyvm的第四个数据中心上线了,位于美国东南沿海的迈阿密市。迈阿密的VPS依旧和buyvm其他机房的一样,KVM虚拟,Ryzen 9 3900x、DDR4、NVMe、1Gbps带宽、不限流量。目前还没有看见buyvm上架迈阿密的block storage,估计不久也会有的。 官方网站:https://my.frantech.ca/cart.php?gid=48 加密货币、信用卡、PayPal、...

Pacificrack:新增三款超级秒杀套餐/洛杉矶QN机房/1Gbps月流量1TB/年付仅7美刀

PacificRack最近促销上瘾了,活动频繁,接二连三的追加便宜VPS秒杀,PacificRack在 7月中下旬已经推出了五款秒杀VPS套餐,现在商家又新增了三款更便宜的特价套餐,年付低至7.2美元,这已经是本月第三波促销,带宽都是1Gbps。PacificRack 7月秒杀VPS整个系列都是PR-M,也就是魔方的后台管理。2G内存起步的支持Windows 7、10、Server 2003\20...

内存泄露为你推荐
国际域名国内域名和国际域名的区别免费com域名注册有没有永久免费的.com之类的域名国内最好的虚拟主机国内虚拟主机哪家的好?虚拟主机控制面板万网的虚拟主机控制面板指的是什么呢?台湾虚拟主机问 美国、香港、台湾虚拟主机哪个好美国虚拟主机推荐美国独立ip虚拟主机哪儿有,推荐下?www二级域名顶级域名,二级域名,网站域名升级访问网站更换域名有什么影响动态域名请问动态域名有什么作用啊?万网域名查询如何查询某个已备案的域名是否是万网备案
买虚拟主机 江西服务器租用 花生壳域名贝锐 赵容 cpanel主机 googleapps bash漏洞 免费cdn加速 免费静态空间 百兆独享 域名接入 流量计费 佛山高防服务器 爱奇艺vip免费试用7天 重庆双线服务器托管 web服务器安全 网站在线扫描 跟踪路由命令 下载速度测试 服务器维护 更多