Cópia superficial : Os valores podem ser atribuídos entre objetos de tipo uniforme.Se os valores das variáveis de membro de dois objetos forem iguais, os dois objetos ainda são dois objetos independentes.
Em circunstâncias normais, não há problema com a cópia superficial, mas quando há um ponteiro na classe e o ponteiro aponta para o espaço de memória alocado dinamicamente, o destruidor executa o processamento de liberação de memória dinâmica, o que causará problemas de memória
#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);
}