• 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");
    }
    
  • 相关阅读:
    整理一波笔记
    python核心编程 --chapter 8 条件和循环
    自动化测试——Selenium+Python判断元素是否可见,及元素未出现时设置超时时限
    自动化测试——Appium+Python解决动态的滑动验证
    自动化测试——从MySQL数据库中读取短信验证码
    自动化测试——解决Element is not clickable at point (x, x). Other element would receive the click
    自动化测试——保存验证码图片至本地
    自动化测试——Selenium+Python之下拉菜单的定位
    自动化测试——Selenium IDE处理iframe问题
    自动化测试——利用Selenium+Python批量录入测试数据
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664737.html
Copyright © 2020-2023  润新知