您的位置:首页 > 编程语言 > C语言/C++

C++之 浅拷贝和深拷贝

2016-02-19 22:54 513 查看
//<strong>浅拷贝只会简单的进行  值拷贝  本demo展示了浅拷贝会引发的漏洞</strong>

#include <iostream>
#include <string>
#pragma warning(disable:4996)
using namespace std;

class Name{
public:
Name(const char* myp){
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;
};

int main()
{
Name obj1("PatkritLee");
Name obj2 = obj1;//浅拷贝,值复制,先调用obj2对象析构函数,释放掉p指向的内存空间,然后再调用obj1对象析构函数时,再次释放,会报错!!!
return 0;
}

可改成 深拷贝 来解决

#include "stdafx.h"
#include <iostream>
#include <string>
#pragma warning(disable:4996)
using namespace std;

class Name{
public:

Name(const char* myp){
len = strlen(myp);
p = (char *)malloc(len + 1);
strcpy(p,myp);
}
//Name obj2=obj1
//解决方案:必要的时候,手工编写拷贝构造函数 使用深层拷贝
Name(const Name& obj1){
len = obj1.len;
p = (char *)malloc(len + 1);
strcpy(p,obj1.p);
}
~Name(){
if (p != NULL){
free(p);
p = NULL;
len = 0;
}
}
private:
char* p;
int len;
};

int main()
{
Name obj1("PatkritLee");
Name obj2 = obj1;
return 0;
}


默认的等号操作符也是浅拷贝

#include "stdafx.h"
#include <iostream>
#include <string>
#pragma warning(disable:4996)
using namespace std;

class Name{
public:

Name(const char* myp){
len = strlen(myp);
p = (char *)malloc(len + 1);
strcpy(p,myp);
}
//Name obj2=obj1
//解决方案:必要的时候,手工编写拷贝构造函数 使用深层拷贝
Name(const Name& obj1){
len = obj1.len;
p = (char *)malloc(len + 1);
strcpy(p,obj1.p);
}
~Name(){
if (p != NULL){
free(p);
p = NULL;
len = 0;
}
}
private:
char* p;
int len;
};
void objplay(){
Name obj1("PatkritLee");
Name obj3("John");
obj3 = obj1;//等号操作,由于没有重载‘=’运算符,因此会机械的将obj1所有的属性都拷贝到obj3中去,因此也会出现上面那样的情况,会发生内存泄露!
//这个跟上面一条的 初始化操作不一样,初始化会调用构造函数!情况不一样,需要区分开!
}
int main()
{
objplay();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: