C++构造 函数,析构函数,拷贝构造函数,赋值构造函数,一个内存错误例子!

 

// pointer_control2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

class U_Ptr {
 friend class HasPtr;
 int *ip;
 size_t use;
 U_Ptr(int *p): ip(p), use(1) { }
 ~U_Ptr() { delete ip; }
};

/* smart pointer class: takes ownership of the dynamically allocated
*          object to which it is bound
* User code must dynamically allocate an object to initialize a HasPtr
* and must not delete that object; the HasPtr class will delete it
*/
class HasPtr {
public:
 // HasPtr owns the pointer; pmust have been dynamically allocated
 HasPtr(int *p, int i): ptr(new U_Ptr(p)), val(i) { }

 // copy members and increment the use count
 HasPtr(const HasPtr &orig):ptr(orig.ptr), val(orig.val) { ++ptr->use; }
 HasPtr& operator=(const HasPtr&);

 // if use count goes to zero, delete the U_Ptr object
 ~HasPtr() { if (--ptr->use == 0) delete ptr; }

 // copy control and constructors as before
 // accessors must change to fetch value from U_Ptr object
 int *get_ptr() const { return ptr->ip; }
 int get_int() const { return val; }

 // change the appropriate data member
 void set_ptr(int *p) { ptr->ip = p; }
 void set_int(int i) { val = i; }

 // return or change the value pointed to, so ok for const objects
 // Note: *ptr->ip is equivalent to *(ptr->ip)
 int get_ptr_val() const { return *ptr->ip; }
 void set_ptr_val(int i) { *ptr->ip = i; }

private:
 U_Ptr *ptr;        // points to use-counted U_Ptr class
 int val;
};


HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
 ++rhs.ptr->use;     // increment use count on rhs first
 if (--ptr->use == 0)
  delete ptr;    // if use count goes to 0 on this object, delete it
 ptr = rhs.ptr;      // copy the U_Ptr object
 val = rhs.val;      // copy the int member
 return *this;
}

 

int _tmain(int argc, _TCHAR* argv[])
{
 int obj = 0;
 int *p=&obj;
 HasPtr ptr1(p, 42); // int* member points to obj, val is 42
 HasPtr ptr2(ptr1);     // int* member points to obj, val is 42
 HasPtr ptr3=ptr1;    //=


 ptr1.set_int(0); // changes val member only in ptr1
 printf("%d\n",ptr2.get_int());  // returns 42
 printf("%d\n",ptr3.get_int());  // pth3 returns 42

 ptr1.get_int();  // returns 0
 printf("%d\n",ptr1.get_int());  // returns 0

 ptr1.set_ptr_val(45); // sets object to which both ptr1 and ptr2 point
 
 printf("%d\n",ptr2.get_ptr_val());  // returns 42
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值