zoukankan      html  css  js  c++  java
  • 养成良好的C++编程习惯(持续更新)

                   

    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,'',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);

        }

    .

    }

  • 相关阅读:
    SpringMVC之数据处理及跳转
    SpringMVC之控制器Controller和RestFul风格
    第一个SpringMVC程序
    什么是SpringMVC
    Spring声明式事务
    【嘎】字符串-反转字符串
    【嘎】字符串-字符串中的单词数
    【嘎】二叉树-226. 翻转二叉树
    【嘎】数组-面试题 01.07. 旋转矩阵-看题解
    【嘎】字符串-统计位数为偶数的数字
  • 原文地址:https://www.cnblogs.com/poissonnotes/p/7765762.html
Copyright © 2011-2022 走看看