经典野指针系列,
先上代码
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
…
if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期 ,只在这个程序块中(花括号里面的两行),而不是整个test函数
}
p->Func(); // p是“野指针”
}
以上举了两个例子,第一种是典型的释放掉了,但是指针未置为NULL,
第二是超出范围(非数组范围)
free 之后不能再delete,同理delete 之后,也不可以再free,否则就会报错。
可以定义这样实用的宏:
#ifndef FREE
#define FREE(x) \
if (x) {\
free(x);\
x = NULL;\
}
#endif
#ifndef FREEDEL
#define FREEDEL(x) \
if (x) {\
delete (x);\
x = NULL;\
}
#endif