#includeusing namespace std;class HasPtr;class U_Ptr{ friend class HasPtr; U_Ptr(int * p) :ip(p), use(1) {} ~U_Ptr() { delete ip; } int * ip; size_t use;};class HasPtr{public: HasPtr(int * p,int i) :ptr(new U_Ptr(p)), val(i){} HasPtr(const HasPtr & orig) : ptr(orig.ptr), val(orig.val) { ++ptr->use; } HasPtr & operator = (const HasPtr &); ~HasPtr() { if (--ptr->use == 1) delete ptr; } public: int * get_ptr()const{ return ptr->ip;} int get_int() const { return val; } void set_ptr(int *p){ ptr->ip = p; } void set_int(int i) { val = i; } int get_ptr_val() const { return *ptr->ip; } int set_ptr_val(int i){ *ptr->ip = i; }private: U_Ptr * ptr; int val;};HasPtr & HasPtr::operator=(const HasPtr & rsh){ ++rsh.ptr->use; if (--ptr->use == 0) delete ptr; ptr = rsh.ptr; val = rsh.val; return * this;}int main(void){ //int obj = 0; // 当像上面那样去定义obj时,是在栈上面申请的变量。在delete的时候,会删除obj指针指向的变量。这样就出现了段错误 int * obj = new int(1); obj[0] = 1; HasPtr *ptr1 = new HasPtr(obj,obj[0]); HasPtr *ptr2 = new HasPtr(*ptr1); HasPtr *ptr3 = ptr2; HasPtr ptr4 = *ptr2; delete ptr1; // delete ptr2; cout << "end " << endl;}
在delete指针的时候,一直出现段错误。
最后发现是最开始创建的指针是指向了栈上的一个变量。所以delete的时候出错了。
改成从堆上面申请的内存的变量,就可以了。