(4)ディープコピーとシャローコピー

浅いコピー:均一タイプのオブジェクト間に値を割り当てることができます.2つのオブジェクトのメンバー変数の値が同じである場合、2つのオブジェクトは2つの独立したオブジェクトのままです。

通常の状況では、浅いコピーでは問題はありませんが、クラスにポインタがあり、そのポインタが動的に割り当てられたメモリスペースを指している場合、デストラクタは動的メモリ解放処理を実行します。これにより、メモリの問題が発生します。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Person
{
    
    
public:
	Person() {
    
    }
	Person(char *name, int age)
	{
    
    
		m_name = (char*)malloc(strlen(name) + 1);
		strcpy(m_name,name);
		m_age = age;
	}

	// 系统默认拷贝构造,简单的值拷贝
	// 如果属性里有指向堆空间的数据,默认的拷贝构造函数会释放堆空间两次,导致空地址
    // 自定义拷贝构造函数,深拷贝
	Person(const Person&p) 
	{
    
    
		m_name = (char*)malloc(strlen(p.m_name) + 1);
		strcpy(m_name, p.m_name);
		m_age =p.m_age;
	}

	~Person()
	{
    
    
		cout << "执行析构函数...." << endl;
		if (m_name != nullptr)
		{
    
    
			free(m_name);
		}
	}
public:

	char *m_name;
	int m_age;
};

int main()
{
    
    
	Person p1((char*)("张三"),18);
	Person p2(p1);
}

おすすめ

転載: blog.csdn.net/qq_40329851/article/details/114293327