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; }
相关文章推荐
- neuq oj 1043: 谭浩强C语言(第三版)习题5.7 C语言
- 关于C语言include尖括号和双引号的对话
- C语言:【动态顺序表】动态顺序表的在指定位置插入元素Insert,以及指定元素Find
- 单件模式
- 74. Search a 2D Matrix
- 【hdu 2896】病毒侵袭 题解&代码(C++)
- C++之 构造函数调用规则
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- Basic C++ Container classes summary(Array, Vector, List)
- c语言入门之项目2.0——成绩等级
- C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack
- C++基础篇之 复制构造函数调用时机
- c/c++题目汇总一
- C语言之getopt使用
- 【hdu 2222】Keywords Search 中文题意&题解&代码(C++)
- 「Cplusplus」在命令提示符下编译C/C++源文件和运行可执行文件
- 整理摘抄 宏定义笔记
- C++之匿名对象与析构函数的关系
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- [UVA227]Puzzle