1 浅拷贝
复制类的对象时,将复制其指针成员,但不复制指针指向的缓冲区,其结果是两个对象指向同一块动态分配的内存。销毁其中一个对象时,delete[]释放这个内存块,导致另一个对象存储的指针拷贝无效。这种复制被称为浅复制,会威胁程序的安全性。
//浅拷贝示意图
//实例
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
class Name
{
public:
Name(const char* myp)
{
int len = strlen(myp);
p =(char*) malloc(len+1);
strcpy(p,myp);
}
~Name()
{
if (p != NULL)
{
free(p);
p = NULL;
len = 0;
}
}
private:
char *p;
int len;
};
void objplaymain()
{
Name obj1("abcdefg");
Name obj2 = obj1;
}
int main()
{
objplaymain();
return 0;
}
//深拷贝示意图
//深拷贝示意图 添加了拷贝构造函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
class Name
{
public:
Name(const char* myp)
{
int len = strlen(myp);
m_p =(char*) malloc(len+1);
strcpy(m_p,myp);
}
//Name obj2 = obj1;
//解决方案: 手工的编写拷贝构造函数 使用深拷贝
Name(const Name& obj1)
{
m_len = obj1.m_len;
m_p = (char*)malloc(m_len + 1);
strcpy(m_p, obj1.m_p);
}
~Name()
{
if (m_p != NULL)
{
free(m_p);
m_p = NULL;
m_len = 0;
}
}
private:
char *m_p;
int m_len;
};
void objplaymain()
{
Name obj1("abcdefg");
Name obj2 = obj1;
}
int main()
{
cout <<"你好:" <<endl;
objplaymain();
return 0;
}
//默认的等号操作
如图所示,若将执行 obj3=obj1 语句,则将地址0xaa11赋给obj3,原先obj3的地址则永久发生内存泄漏。
//抛砖代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
class Name
{
public:
Name(const char* myp)
{
int len = strlen(myp);
m_p =(char*) malloc(len+1);
strcpy(m_p,myp);
}
//Name obj2 = obj1;
//解决方案: 手工的编写拷贝构造函数 使用深拷贝
Name(const Name& obj1)
{
m_len = obj1.m_len;
m_p = (char*)malloc(m_len + 1);
strcpy(m_p, obj1.m_p);
}
~Name()
{
if (m_p != NULL)
{
free(m_p);
m_p = NULL;
m_len = 0;
}
}
private:
char *m_p;
int m_len;
};
void objplaymain()
{
Name obj1("abcdefg");
//Name obj2 = obj1; //默认的copy函数 C++编译器给我们提供的
//初始化
Name obj3("obj3"); //等号操作 初始化和等号操作是两个不同的概念
//显示的重载等号操作符
}
int main()
{
cout <<"你好:" <<endl;
objplaymain();
return 0;
}
参考博客:https://blog.csdn.net/caoshangpa/article/details/79226270