羌塘之风

重剑无锋,大巧不工。

导航

智能指针

 

  今天总结下C++中智能指针的学习。

  在类的数据成员中,如果存在指针成员,如果用此类定义两个对象A,B,当将A复制给B时,A中的指针成员的值将复制给B中对应的指针成员。这时出现一个问题就是,如果A中的指针成员指向的是堆中的变量,则在复制的过程中,将堆中的那个变量的地址复制给了B中相应的指针变量,如果此时对A中的指针成员进行delete释放堆中的变量,由于B并不知道堆中的变量已经被释放,所以此时B中的指针成员成为了悬浮指针,这时如果再对B中的指针变量进行delete,将引发灾难。。。。

  好吧,语言表述能力太差,用个代码描述这个过程:

#include<iostream>
using namespace std;

class hasptr{
public:
	hasptr(int *p,int i):ptr(p),val(i){};
	int *getptr(){return ptr;}
	int getval(){return val;}
	void setptr(int *p){ptr=p;}
	void setval(int i){val=i;}
	void set_ptr_val(int i){*ptr=i;}
	int get_ptr_val(){return *ptr;}
	~hasptr(){
		delete ptr; //删除ptr指向的变量
} private: int *ptr; int val; }; int main(){ int *obj=new int(0); hasptr *p1=new hasptr(obj,42); cout<<"create p1"<<endl; hasptr *p2=new hasptr(*p1); cout<<"create p2"<<endl; p1->set_ptr_val(100); cout<<p1->get_ptr_val()<<" "<<p2->get_ptr_val()<<endl; delete p1; delete p2; cout<<"end world"<<endl; return 0; }

  运行结果如下:

  delete p1语句导致p1->ptr指向的变量被释放,而此时p2->ptr并不知道如此,所以当deltete的时候,程序报错。

  用一个图片解释就是:

posted on 2013-11-01 22:26  羌塘之风  阅读(192)  评论(0)    收藏  举报