一、空指针问题
1、指针在使用前没有做为空判断,导致程序Crash
2、指针在new之后没有判断是否new成功
3、类成员指针没有初始化,却在析构函数中判断是否为空并删除
二、内存越界问题
内存越界导致的问题往往比空指针来得更严重,因为有很高的几率可能导致死机。
以下是我们采取的解决方案:
wsprintf 和 sprintf 一律使用 _snwprintf 和 _snprintf 代替
memcpy 尽量使用 SafeMemCopy 代替
SafeMemCopy 的实现如下:
#define SAFEMEMCPY_SUC 0
#define SAFEMEMCPY_LENGTH_ERROR 1
#define SAFEMEMCPY_POINTNULL_ERROR 2
inline int SafeMemCopy(void* pDest, size_t lenDest, const void* pSource, size_t lenSource)
{
if(lenSource > lenDest)
{
return SAFEMEMCPY_LENGTH_ERROR;
}
if((NULL == pDest) || (NULL == lenSource))
{
return SAFEMEMCPY_POINTNULL_ERROR;
}
memcpy(pDest, pSource, lenSource);
return SAFEMEMCPY_SUC;
}
三、 内存泄露
1、 删除指针数组时,容易忘记删除数组中指针指向的空间,造成内存泄露
2、 在WM下构造字体,创建画笔等资源,在使用后忘记删除,造成内存泄露。建议少使用HFont,HPen等句柄方式,而采用CFont, CPen等
3、 在执行逻辑复杂,拥有多处返回的函数中,往往容易在函数返回时忘记删除指针,造成泄露。建议多使用智能指针。
四、 内存浪费
1、 在存在继承关系的地方。除非确定的确属于公有的部分,否则不要将多余成员放置到基类中
2、 使用量比较大的结构体尽量不要采用一个最大长度的数组在存储内容,建议改为指针和长度表示