c++语言的灵活是建立在对编程者个人的编程素质的严格要求基础上的,好的C++编程习惯能避免很多问题。

没有好的编程习惯,极有可能编写一行代码,编译器能报十几个错误,而且就算编译通过了,将来在运行过程中也会有很多莫名奇妙的问题。

             
 

  1. 给字符串分配内存的时候,new char[]与 new char[size] 尽量用后者

    下面这段代码在debug和releae模式下不出问题,但是生产环境下,有的时候不报错,有的时候报错报得能让你怀疑人生。

    经验是:不要把c++想得太智能了,很多时候还是要编程者自己老老实实把东西写明确了。

       
     

  2. 主线程里面如果有子线程的话,退出的时候,最好在主线程结束前,等待全部子线程自然关闭。

             
     

  3. 栈分配的大小是有限制的,在不同的编译器里面最大大小有不同限制。

    如下面的:

    #define
BUFSIZE (1* 1024 *1024) // 1M//设置太大了,会 栈溢出

    class
A

{

protected:

unsigned
char
buffer[BUFSIZE];

};

         
 

像这种局部变量,都是系统自动分配,分配在栈上。栈分配空间过大,会出现stack overflow的错误。

 

  1. 指针作为函数的形参传递时,出了这个函数体,指针是不会改变所指向的地址的

    类似于这种 int creat(struct soldier *s_head,int c,int m) 函数,想要在函数体内把s 指向其他的地址,出了函数体之后,发现s还会是原来的地址。

    只能改成 int creat(struct soldier **s_head,int c,int m)这种方式,改变指针所指向的地址的值,并且还要在函数中有些地方可能也要修改一下,

    如:s_head=s_p=s_q=0; 改为 *s_head=s_p=s_q=0;

           
     

  2.    Dll封装的时候一般是哪里申请哪里释放,谁申请的内存由谁释放,这是封装的基本原则。

    如果一定要在dll里面new 空间出来给其他模块使用,那么一定在这个dll里面有一个释放空间的接口供其他模块回收空间,比如说

    DLL:

            #include <stdio.h>

            #include <string.h>

            #include <malloc.h>

         
     

           _declspec(dllexport)  void  testFunc(char **tmp)

            {

                        *tmp = (char *)malloc(sizeof(char)*100);

                        memset(*tmp,'\0',100);

                         strcpy(*tmp,"susan");

             }

         
     

             _declspec(dllexport)  freeTestFuncMemory(char **tmp)

             {

                         if(NULL != *tmp)

                         {

                                    free(*tmp);

                         }

              }

       
     

  3. 当一个类的成员里面有指针成员时,记得要给类添加复制构造函数,复制构造函数及析构函数里面要加上对指针成员的处理

    比如

    class
    CFileDownUpModel

    {

    public:

        CFileDownUpModel();

        ~CFileDownUpModel();

        

        CFileDownUpModel(const
    CFileDownUpModel& model);//复制构造函数

        

        char* Id;

        char*    Path;

    };

     

    CFileDownUpModel::CFileDownUpModel(const
    CFileDownUpModel& model) :Id(0), Path(0), Remark(0), strFileId(0),

    FileSize(0),

    DownUpSize(0),

    DownUpType(0),

    Finish(0),

    StartTime(0),

    EndTime(0)//复制构造函数

    {

        if (model.Id)

        {

            size_t
length = strlen(model.Id) + 1;

            Id = new
char[length];

            memset(Id, 0, length);

            memcpy(Id, model.Id, length);

    }


….

}

养成良好的C++编程习惯(持续更新)的更多相关文章

  1. 养成这8个编程习惯,你的Python性能将蹭蹭蹭地往上涨

    Python不以性能见长,但掌握一些技巧,也可尽量提高程序性能,避免不必要的资源浪费. 1. 使用局部变量 尽量使用局部变量代替全局变量:便于维护,提高性能并节省内存. 使用局部变量替换模块名字空间中 ...

  2. MySQL操作中的一些细节及良好习惯--------持续更新中...

    1.尽量不要写太过复杂的SQL查询,不要想着非要一次性将结果全部以前端要求的形式返回出来,可以多次分开查询,这样逻辑清晰,问题解决速度快,方便维护,并且SQL的效率也高. 2.在使用联表查询的时候,关 ...

  3. 一些有意思的面试题(持续更新) .C语言编程技巧札记

    一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...

  4. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  5. 4W字的后端面试知识点总结(持续更新)

    点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...

  6. ( 译、持续更新 ) JavaScript 上分小技巧(一)

    感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...

  7. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  8. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  9. BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js

    BAT 前端开发面经 —— 吐血总结   目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...

随机推荐

  1. yii去掉自动排序功能

    Yii去掉自动排序功能并自定义排序 public function search($params) { $query = SvnManage::find()->addOrderBy([ 'cre ...

  2. 检测版本更新,iOS

    检测版本更新的方法. //检查新版本 更新 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^ ...

  3. session与cookie的区别是什么?如果客户端禁用了cookie功能,将会对session有什么影响?

    cookie 和session 的区别: a.cookie数据存放在客户的浏览器上,session数据放在服务器上. b.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE ...

  4. JS中原始类型Null和Undefined

    Undefined类型只有一个值,即undefined.当声明的变量还未被初始化时,变量的默认值为undefined.Null类型也只有一个值,即null.null用来表示尚未存在的对象,常用来表示函 ...

  5. SQL 关联外键报错类型不匹配

    如题,关联外键的时候,报错类型匹配.但是两个 类型都是int sql 如下: CREATE TABLE IF NOT EXISTS `alert_receiver_map` ( `id` INT UN ...

  6. 原生ajax请求

    $('#send').click(function(){ //请求的5个阶段,对应readyState的值 //0: 未初始化,send方法未调用: //1: 正在发送请求,send方法已调用: // ...

  7. Hibernate(7)关联关系_单向1对n

    1.单向一对多(@OneToMany)关联是比较少用的(一般用双向一对多代替). 2.实体类: 1端:Publishers.java public class Publishers { private ...

  8. hive sql 里面的注释方式

    如果建表ddl 用 comment 这个没问题 那么在sql 语句里面呢,这个貌似不像mysql 那样能用 # // /* */ (左边这些都不行) 其实用 -- comment 就行啦 貌似上面的- ...

  9. Github超棒资源汇总

    Awesome List 中文资源大全 经典编程书籍大全 免费的编程中文书籍索引 awesome-awesomeness-zh_CN https://github.com/jnv/lists awes ...

  10. javap 指令集

    栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型 ...