1. 比如有 A* a; 然后在未赋值的情况下直接使用指针 a
2. 比如有 A* a; a=&obj; 如果 obj 事先已经被删掉了,那么这个指针赋值就会运行出错
3. 比如有 int a[10]; int* p=&a[0]; p+10; // 数组指针越界报错
4. 尝试访问或删除某个函数返回指针, which已经指向了无效的地址
例如:
#include <iostream>
using namespace std;
class MyClass
{
public:
int i;
MyClass(int value): i(value){}
};
MyClass func1()
{
MyClass my(111);
return my;
}
MyClass* func2()
{
MyClass* my = new MyClass(222); //指针my存放在堆上,退出函数体以后也仍然存在
return my;
}
MyClass* func3()
{
MyClass my(333); //对象my存放在桟上,退出函数体以后改地址就可能无效了。
MyClass* ptr = &my; //指针ptr指向了一个可能已经无效的地址,危险。
return ptr;
}
int main()
{
MyClass obj = func1();
cout<< obj.i <<endl;
MyClass* ptr = func2();
cout<< ptr->i <<endl;
delete ptr; //Okay and have to delete it, otherwise memory leak
MyClass* ptr3 = func3();
cout<< ptr3->i <<endl; //Maybe wrong...can't guaranteed...
delete ptr3; //Error, ptr3指向的局部变量my对象已经不存在了
system("PAUSE");
return 0;
}
--------- output -------------
111
222
333 //可能报错 malloc: *** error for object 0x7fff5fbff9d0: pointer being freed was not allocated
------------------------------
注意点:对于函数返回的指针对象,需要确保其指向有效的地址,而且用完以后需要及时delete