zoukankan      html  css  js  c++  java
  • 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");
    }
    
  • 相关阅读:
    对于“机器视觉(computer version)”的反思
    图像视觉的调试
    对自主标定的实现
    使用dll,将image库开放出去
    使用liner、feather、multiband对已经拼接的数据进行融合(下)
    使用liner、feather、multiband对已经拼接的数据进行融合
    模版多匹配
    Metasploit AFP爆破模块afp_login
    SQLite中SELECT基本形式
    Nmap 7.70新增功能——扫描主机所有IP
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664738.html
Copyright © 2011-2022 走看看