直接看代码更直观,注释都在代码里
#include <iostream>
using namespace std;
//浅拷贝demo
class A{
public:
~A()
{
cout << "A析构函数" << endl;
}
A() :m_num(0){}
void setNum(int num){
m_num = num;
}
int getNum()
{
return m_num;
}
private:
int m_num;
};
//深拷贝demo1 内存泄漏版
class B{
public:
B(const char *str = ""){
cout << "B构造函数" << endl;
m_data = new char[strlen(str) + 1];
memset(m_data, 0, strlen(str) + 1);
memcpy(m_data, str, strlen(str));
}
~B(){
if (m_data)
{
cout << "B析构函数" << endl;
delete m_data;
m_data = nullptr;
}
}
char *m_data;
};
//深拷贝demo2 正常版
class C{
public:
C(const char *str=""){
cout << "C构造函数" << endl;
m_data = new char[strlen(str) + 1];
cout << "sizeof(m_data)=" << sizeof(m_data)
<<" sizeof(*m_data)="<<sizeof(*m_data)
<<" strlen(str)+1="<<strlen(str)+1<< endl;
memset(m_data, 0, strlen(str) + 1);
memcpy(m_data, str, strlen(str));
}
~C(){
if (m_data)
{
cout << "C析构函数" << endl;
delete m_data;
m_data = nullptr;
}
}
C(const C &c)
{
cout << "拷贝构造" << endl;
int len = strlen(c.m_data) + 1;
m_data = new char[len];
memset(m_data, 0, len);
memcpy(m_data, c.m_data, strlen(c.m_data));
}
char *getData()
{
return m_data;
}
char *m_data;
};
//客户端
int main()
{
//浅拷贝 没有指针的时候,不需要担心内存泄漏
A a;
a.setNum(10);
A a1 = a;
cout << "num=" << a.getNum() << endl; //输出10
cout << "num=" << a1.getNum() << endl; //输出10
//深拷贝 崩溃版,指针指向同一块内存,析构时释放指针会被释放两次
//B b;
//B b1 = b;
//深拷贝 正常版
C c("123456");
cout << "c=" << c.getData() << endl;
C c1 = c;
cout << "c1="<<c1.getData()<< endl;
return 0;
}
效果