• C++之用程序理解浅拷贝


    C++中的浅拷贝是产生很多问题的根本原因,其根本原因是在有指针的时候,只是拷贝了一个指针的值,多个指针指向同一块内存区域,当free内存时,造成其他指针指向的空间不存在。结合构造函数和析构函数理解浅拷贝是一个不错的选择

    原始程序

    #include "iostream"
    using namespace std;
    
    class Name
    {
    public:
    	Name(const char *pname)
    	{
    		size = strlen(pname);
    		pName = (char *)malloc(size + 1);
    		strcpy(pName, pname);
    	}
    	~Name()
    	{
    		cout<<"开始析构"<<endl;
    		if (pName!=NULL)
    		{
    			free(pName);
    			pName = NULL;
    			size = 0;
    		}
    	}
    
    protected:
    private:
    	char *pName;
    	int size;
    };
    
    void playObj()
    {
    	Name obj1("obj1.....");
    }
    void main()
    {
    	playObj();
    	system("pause");
    }
    

    对象的初始化

    使用对象的初始化时候,会调用copy构造函数,在copy构造函数中进行深拷贝

    #include "iostream"
    using namespace std;
    
    class Name
    {
    public:
    	Name(const char *pname)
    	{
    		size = strlen(pname);
    		pName = (char *)malloc(size + 1);
    		strcpy(pName, pname);
    	}
        Name(Name &obj)
    	{
    		//用obj来初始化自己
    		pName = (char *)malloc(obj.size + 1);
    		strcpy(pName, obj.pName);
    		size = obj.size;
    	}
    	~Name()
    	{
    		cout<<"开始析构"<<endl;
    		if (pName!=NULL)
    		{
    			free(pName);
    			pName = NULL;
    			size = 0;
    		}
    	}
    
    protected:
    private:
    	char *pName;
    	int size;
    };
    
    void playObj()
    {
    	Name obj1("obj1.....");
        Name obj2 = obj1; //obj2创建并初始化
    }
    void main()
    {
    	playObj();
    	system("pause");
    }
    

    对象的=操作

    在对象的=操作的时候,也是浅拷贝,此时需要使用运算符重载来解决问题

    #include "iostream"
    using namespace std;
    
    class Name
    {
    public:
    	Name(const char *pname)
    	{
    		size = strlen(pname);
    		pName = (char *)malloc(size + 1);
    		strcpy(pName, pname);
    	}
        Name(Name &obj)
    	{
    		//用obj来初始化自己
    		pName = (char *)malloc(obj.size + 1);
    		strcpy(pName, obj.pName);
    		size = obj.size;
    	}
    	~Name()
    	{
    		cout<<"开始析构"<<endl;
    		if (pName!=NULL)
    		{
    			free(pName);
    			pName = NULL;
    			size = 0;
    		}
    	}
        void operator=(Name &obj3)
    	{
    		//用obj3来=自己
    		pName = (char *)malloc(obj3.size + 1);
    		strcpy(pName, obj3.pName);
    		size = obj3.size;
    	}
    
    protected:
    private:
    	char *pName;
    	int size;
    };
    
    void playObj()
    {
    	Name obj1("obj1.....");
        Name obj2 = obj1; //obj2创建并初始化
        Name obj3("obj3...");
        obj2 = obj3;
    }
    void main()
    {
    	playObj();
    	system("pause");
    }
    

    上面程序存在的问题

    在以上程序中,存在内存泄漏,obj2的指针重新指向的时候,原来的内存没有释放

    #include "iostream"
    using namespace std;
    
    class Name
    {
    public:
    	Name(const char *pname)
    	{
    		size = strlen(pname);
    		pName = (char *)malloc(size + 1);
    		strcpy(pName, pname);
    	}
        Name(Name &obj)
    	{
    		//用obj来初始化自己
    		pName = (char *)malloc(obj.size + 1);
    		strcpy(pName, obj.pName);
    		size = obj.size;
    	}
    	~Name()
    	{
    		cout<<"开始析构"<<endl;
    		if (pName!=NULL)
    		{
    			free(pName);
    			pName = NULL;
    			size = 0;
    		}
    	}
        void operator=(Name &obj3)
    	{
    		if (pName != NULL)
    		{
    			free(pName);
    			pName = NULL;
    			size = 0;
    		}
    		//用obj3来=自己
    		pName = (char *)malloc(obj3.size + 1);
    		strcpy(pName, obj3.pName);
    		size = obj3.size;
    	}
    
    protected:
    private:
    	char *pName;
    	int size;
    };
    
    void playObj()
    {
    	Name obj1("obj1.....");
        Name obj2 = obj1; //obj2创建并初始化
        Name obj3("obj3...");
        obj2 = obj3;
    }
    void main()
    {
    	playObj();
    	system("pause");
    }
    
  • 相关阅读:
    Djiango项目的创建以及配置介绍1
    最大矩形土地 单调栈或者DP
    0917 lxs 反思
    0915 反思
    codeforces 1209/C Paint the Digits 观察
    NOIP2014 解方程 秦九韶算法+多项式处理
    整数拆分问题
    机器人M号
    有趣的数列 唯一分解定理+卡特兰数
    数位DP 不要62
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664737.html
Copyright © 2020-2023  润新知