本人从接触C和C++已经有不少年头了,不过真正在项目中运用C/C++时间并不长,可能还不到2年时间,近期在项目中对C/C++的使用过程中感觉有一些地方容易出问题,所以特写一些总结以供作记录。
1. C++中单例类的使用
单例类,听名字就可以知道在一个程序中,这个类只能存在一个实例。
那么我们怎么保证它在一个程序中只存在一个实例呢?于是乎有人想到用一种比较挫的方法,那就是人为的定规矩,leader跟手下的程序猿说:这个类要用单例模式,你们在程序中只能创建一个实例,要是有人敢多创建我就扣他工资。
比较靠谱的作法是用方法去约束,我定义一个类不管谁用我这个类,他都无法创建多个实例。这个方法不错,不过不是我想出来的,是C++给出来的方法。不过我们在使用这种方法中可能会一不注意被别人钻了空子,下面我们来看一个例子。
Class Singleton
{
private:
Singleton*inst;
public:
staticSingleton* GetInstance()
{
if(NULL == inst)
{
new Singleton();
}
return inst;
}
};
有没有问题?乍一看好像没什么问题,好吧,就当没有问题。项目代码里面不会把类名都定义成这种一看名字就知道是单例的吧,所以光从名字可能看不出来。假如项目组来了一个新员工,他的代码里要使用这个类,于是似他就 Singleton* pInst = new Singleton(); 怎么样?现在会出现什么情况?答案是他会new成功,这个类有了一个新的实例。为什么会这样?因为我们忽略了一个重点,我们没能从方法上约束使用者。不多费话了,下面贴上我认为比较正确的定义方法:
Class Singleton
{
private:
Singleton(); //构造函数声明成私有成员,使用者无法new出实例,
//保证实例获取只有一个接口
public:
staticSingleton* GetInstance()
{
static Singleton sInst; //个人比较喜欢用静态变量
return &sInst;
}
};
看了这种定义,大家应该明白了。另外,单例里面如果有必要的话,尽量提供一个重位功能的接口,通过这个接口可以使这个实例还原到初始化状态。
2. 数组和字符串操作
数组和字符串的操作最怕的就是地址越界。我们在使用过程中要尽量去判断数组的下标和字符串的长度。字符串拷贝建议大家使用strncpy函数去代替strcpy函数,前者比后者较安全。还有一点,定义的字符型数组或者malloc回来的空间使用前尽量先初始化。
3. 函数入参的判断
进入函数后的第一步应该是入参有效性的检测,特别是入参包括指针类型的。
4. 同步互斥
在多线程编程过种中,同步互斥特别重要。要注意一些公共资源的访问,一定要上锁,每一个可重入函数的编写都要注意。
5. 代码的可读性
代码不光是只给我们自己看,我们是以团队为单位的,所以写出来的代码要尽量让其他人能看懂。自己写的代码,隔一段时间去看,发现自己看好半天没看懂,有木有?所以代码的结构要尽量简单,不要一味的追求高效率。少用全局变量,少给后人挖点坑。另外我个人认为在代码里面还需要多加注释。
这几点是我暂时能想到的,以后有更多内容我会发出来与大家共享,写的不恰之处请大家批评指正!
安宇俊
2012-11-7