浅いコピー:均一タイプのオブジェクト間に値を割り当てることができます.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);
}