C++被人骂娘最多的就是指针。
夜深人静的时候,拿出几个使用指针容易出现的坑儿。可能我的语言描述有些让人费劲,尽量用代码说话。
**通过指向类的NULL指针调用类的成员函数**
试图用一个null指针调用类的成员函数,导致崩溃:
~~~
#include <iostream>
using namespace std;
class A
{
int value;
public:
void dumb() const {cout << "dumb()\n";}
void set(int x) {cout << "set()\n"; value=x;}
int get() const {cout << "get()\n"; return value;}
};
int main()
{
A *pA1 = new A;
A *pA2 = NULL;
pA1->dumb();
pA1->set(10);
pA1->get();
pA2->dumb();
pA2->set(20);//崩溃
pA2->get();
return 0;
}
~~~
为什么会这样?
通过非法指针调用函数,就相当于给函数传递了一个指向函数的非法指针!
但是为什么pA2->dumb()会成功呢?
因为导致崩溃的是访问了成员变量!!
**使用已经释放的指针**
~~~
struct X
{
int data;
};
int foo()
{
struct X *pX;
pX = (struct X *) malloc(sizeof (struct X));
pX->data = 10;
free(pX);
...
return pX->data;
}
~~~
**使用未初始化的指针**
如果你这样写,编译器会提示你使用了未初始化的变量p。
~~~
void fooA()
{
int *p;
*p = 100;
}
~~~
那么如果我释放一个初始化的指针呢?
~~~
void fooB()
{
int *p;
free(p);
}
~~~
结果是一样的!!
**释放已经释放的指针**
直接看看代码:
~~~
void fooA()
{
char *p;
p = (char *)malloc(100);
cout << "free(p)\n";
free(p);
cout << "free(p)\n";
free(p);
}
~~~
这样的问题也许不会立即使你的程序崩溃,那样后果更加严重!!
**没有调用子类的析构函数**
之前的博客讲过,父类的析构函数最好声明为虚!!
~~~
ParentClass *pObj = new ChildClass;
...
delete pObj;
~~~
上述代码会造成崩溃,如果父类的析构函数不声明为虚,那么不会调用继承类的析构函数,造成内存泄露。
**内存溢出**
当我们拷贝字符串的时候,我们常常会用到 memcpy函数。这里特别需要注意的就是字符串结尾的null字符:
~~~
char *p = (char *)malloc(strlen(str));
strcpy(p, str);
~~~
为了躲过这个坑,只需要把 strlen(str) 改为 strlen(str)+1。
- 前言
- deprecated关键字
- 指针(内存泄露)
- 头文件相互包含(Compiler error C2653: not a class or namespace name)
- 获取一张图片的width和height
- This function or variable may be unsafe.
- 智能指针陷阱
- string中的c_str()陷阱
- wstring与string的转换
- windows下chrome浏览器插件不能安装
- 重定义关键字
- 正确释放vector的内存
- 获取设备环境HDC
- 抽象类不能实例化对象(但是你明明定义的不是抽象类)
- 重载赋值运算符的自我赋值
- 程序中的变量未初始化
- 成对使用new和delete时要采取相同的形式
- 意想不到的除数为零
- map的初始化(插入数据)
- 正则表达式截取字符串
- 捕获窗口之外的鼠标消息(钩子还是??)
- 类中的静态成员变量(static or const static)
- 有if就要有else(一定成对)
- map查找结果处理
- 使用using namespace std的坏习惯
- new一个指针数组、以及创建动态二维数组
- 使用太多的全局变量
- 没有及时break出for循环
- vector使用erase后迭代器变成野指针
- C++函数的默认参数(重新定义默认参数)
- 0xC0000005: 读取位置 xxx时发生访问冲突
- std::string初始化、最快速判断字符串为空
- 你开发的软件安装在C盘Program Files (x86)下产生的异常