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);
}
… ….
}