c++語言的靈活是創建在對編程者我的的編程素質的嚴格要求基礎上的,好的C++編程習慣能避免不少問題。 c++
沒有好的編程習慣,極有可能編寫一行代碼,編譯器能報十幾個錯誤,並且就算編譯經過了,未來在運行過程當中也會有不少莫名奇妙的問題。 編程
下面這段代碼在debug和releae模式下不出問題,可是生產環境下,有的時候不報錯,有的時候報錯報得能讓你懷疑人生。 函數
經驗是:不要把c++想得太智能了,不少時候仍是要編程者本身老老實實把東西寫明確了。 spa
以下面的: 線程
#define BUFSIZE (1* 1024 *1024) // 1M//設置太大了,會 棧溢出 debug
class A 指針
{ blog
protected: 接口
unsigned char buffer[BUFSIZE]; 內存
};
像這種局部變量,都是系統自動分配,分配在棧上。棧分配空間過大,會出現stack overflow的錯誤。
相似於這種 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;
若是必定要在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);
}
}
好比
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);
}
… ….
}