这样确保了共享的对象在没有指针指向它的时候才被delete掉,也不会发生内存的非法访问了。

  另一种方法是把类设计成和值类型具有相同的复制行为,即复制类对象的同时复制指针指向的值,而不是只复制指针的值。于是可以把上述MyClass这样定义:

class MyClass
{
    public:
        MyClass(int &p,int i): ptr(new int(p)), value(i) { }
        MyClass(const MyClass &mc): ptr(new int(*mc.ptr)), value(mc.value) { }//把值也复制
        ~MyClass() { delete ptr; }//这里可以直接释放

        MyClass& operator=(const MyClass&);
        int get_share_value() { return *ptr; }
        int get_value() { return value; }
        void set_share_value(int i) { *ptr = i; }
        void set_value(int i) { value = i; }

    private:
        int *ptr;
        int value;
};

MyClass& MyClass::operator=(const MyClass &mc)
{
    *ptr = *mc.ptr;
    value = mc.value;

    return *this;
}

  这样每个指针都指向一个值相同但相互独立的对象,delete后也不会影响到其他的对象。

  这种方法也叫深度复制,在C#中可以通过实现clone接口来完成。