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

               

c++语言的灵活是创建在对编程者我的的编程素质的严格要求基础上的,好的C++编程习惯能避免不少问题。 c++

没有好的编程习惯,极有可能编写一行代码,编译器能报十几个错误,并且就算编译经过了,未来在运行过程当中也会有不少莫名奇妙的问题。 编程

               

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

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

    经验是:不要把c++想得太智能了,不少时候仍是要编程者本身老老实实把东西写明确了。 spa

         

  2. 主线程里面若是有子线程的话,退出的时候,最好在主线程结束前,等待所有子线程天然关闭。

               

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

    以下面的: 线程

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

    class A 指针

{ blog

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

    }

.

}

相关文章
相关标签/搜索