zoukankan      html  css  js  c++  java
  • C++指针拷贝

    #include <iostream>
    
    using namespace std;
    
    class data
    {
        int* value;
    public:
        data(int v){value = new int(v);}
        ~data(){delete value;}
        void display(){cout<<"指向的内存:"<<&*value<<endl;};
    };
    
    void testCopy()
    {
        data m(10);
        data p = m;
        m.display();
        p.display();
    }


    这段代码的问题是:delete被调用了2次,由于第二次调用的复制构造函数,指针p->value指向m->value的内存,并没有分配新的内存。

     解决办法:

    1.把复制构造函数定义为private:

    class data
    {
        int* value;
        data(const data&);
        data& operator = (const data&);
    public:
        data(int v){value = new int(v);}
        ~data(){delete value;}
    };

    2.自定义复制构造函数,给指针对象分配内存

    class data
    {
        int* value;
        //data(const data&);
        //data& operator = (const data&);
    public:
        data():value(NULL){}
        data(int v){value = new int(v);}
        ~data(){delete value;}
        data(const data& d){
            if (NULL != d.get_ptr()) {
                value = new int(*d.get_ptr());
            }
        };
        void display() const {cout<<"指向的内存:"<<&*value<<endl;}
        int* get_ptr() const { return value;}
    };
    
    void testCopy()
    {
        data m(10);
        data p = m;
        m.display();
        p.display();
    }
     
     
     
     
  • 相关阅读:
    Spring加载机制
    SpringMVC 请求过程
    Spring事务传播机制
    数组扩容
    hashmap 底层原和扩容机制
    spring源码
    金字塔表达方式(三)如何使得一个事情变得清晰有逻辑
    金字塔表达方式(二)如何判断事情的逻辑是否正确
    C#设计模式(3)——单例模式(Singleton)
    C#设计模式(2)——工厂模式
  • 原文地址:https://www.cnblogs.com/fripside/p/2892159.html
Copyright © 2011-2022 走看看