深拷贝和浅拷贝的问题探究

浅拷贝的问题分析:

#include <iostream>
#include <string.h>
using namespace std;

class Name
{
public:
	Name(const char *p)
	{
		m_len=strlen(p);
		m_p=(char *)malloc(m_len+1);
	}
	~Name()
	{
		cout<<"析构函数被调用"<<endl;
		if(m_p!=NULL)
		{
			free(m_p);
			m_p=NULL; 
			m_len=0;
		}
		cout<<"析构函数执行结束"<<endl;
	}
private:
	char *m_p;
	int m_len;
};
  
int main()
{
	{
		Name name1("xiaoming");
		Name name2=name1;
	}

	return 0;
}

执行结果如下:

由上面的执行结果可知:浅拷贝即name2这个对象和name1用的是同一块内存,当name1执行完之后,将内存释放,所以name2执行时就没有内存用来释放,所以第二次执行析构函数~name时会出错。

浅拷贝问题解决:深拷贝

#include <iostream>
#include <string.h>
using namespace std;

class Name
{
public:
	Name(const char *p)
	{
		m_len=strlen(p);
		m_p=(char *)malloc(m_len+1);
	}
	
	Name(const Name &obj)
	{
		m_len=obj.m_len;
		m_p=(char *)malloc(m_len+1);
		strcpy(m_p,obj.m_p);
	}

	~Name()
	{
		cout<<"析构函数被调用"<<endl;
		if(m_p!=NULL)
		{
			free(m_p);
			m_p=NULL; 
			m_len=0;
		}
		cout<<"析构函数执行结束"<<endl;
	}
private:
	char *m_p;
	int m_len;
};
  
int main()
{
	{
		Name name1("xiaoming");
		Name name2=name1;
	}

	return 0;
}

执行结果如下:

从执行结果分析可得:解决浅拷贝的方案:手动编写拷贝构造函数,进行深拷贝。这样他们就分别拥有各自的内存。

猜你喜欢

转载自blog.csdn.net/ShiHongYu_/article/details/81191917