C++深拷贝与浅拷贝

时间:2023-03-09 17:41:18
C++深拷贝与浅拷贝

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数: (1)一个对象以值传递的方式传入函数体 (2)一个对象以值传递的方式从函数返回 (3)一个对象需要通过另外一个对象进行初始化。 如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝。

//深拷贝与浅拷贝
class Name
{
public:
	Name(const char *_p)
	{
		len = strlen(_p);
		m_p = (char *)malloc(len + 1);
		strcpy(m_p, _p);
	}
	//Name obj2 = obj1;
	//手工编写copy构造函数,适用深拷贝
	Name(const Name& obj)
	{
		len = obj.len;
		m_p = (char *)malloc(len + 1);
		strcpy(m_p, obj.m_p);
	}
	~Name()
	{
		if (m_p != NULL)
		{
			free(m_p);
			m_p = NULL;
			len = 0;
		}
	}
private:
	char *m_p;
	int len;
protected:
};
void obj_main()
{
	Name obj1("abcdefg");
	Name obj2 = obj1;//默认的copy构造函数  C++编译器提供的
}
int main()
{
	obj_main();
	system("pause");
	return 0;
}

浅拷贝只是把内存变量拷贝了一份,即两个变量存储的是相同的指针变量,指向同一块内存空间。析构的时候是先析构obj2的,然后是obj1的。

这就出现了问题:当obj2把内存释放了(如:析构),这时obj1的指针就是野指针了,出现运行错误。

C++深拷贝与浅拷贝

深拷贝是把obj1所指向的内容复制一份,分别指向不同的内存空间。

C++深拷贝与浅拷贝