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

    }

.

}

相關文章
相關標籤/搜索