养成良好的C++编程习惯(持续更新)

时间:2022-12-30 15:16:01

             
 

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

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

             
 

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

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

    养成良好的C++编程习惯(持续更新)

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

    养成良好的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);

    }


….

}