C++学习记录15--类中的深拷贝和浅拷贝
2017-09-28 17:28
162 查看
深拷贝和浅拷贝的实质在于防止悬挂指针
当类中的数据成员含有指针或者引用时,如果简单的定义拷贝复制函数,那即是指针的复制拷贝,这样的话两个对象中的指针成员会指向一段相同的内存。如果使用其中的一个释放掉堆中的内存,再使用另一个释放的时候,程序会报错,甚至奔溃。
这段代码中,简单定义了类stest中有一个char *s;若无A行,程序正常,如下图右上角显示。若使用拷贝构造函数,可以看到,是第二次调用析构函数时发生的奔溃。
另外,strlen()函数求字符串长度时不包含空字符’\0’;
当类中的数据成员含有指针或者引用时,如果简单的定义拷贝复制函数,那即是指针的复制拷贝,这样的话两个对象中的指针成员会指向一段相同的内存。如果使用其中的一个释放掉堆中的内存,再使用另一个释放的时候,程序会报错,甚至奔溃。
#include<iostream> using namespace std; #include<string.h> class stest { char *s; public: stest(char *p=0) { if(p==0) s=0; else { s=new char[strlen(p)+1]; strcpy(s,p); cout<<strlen(p)<<endl;; } cout<<"调用了构造函数"<<endl; } ~stest() { if(s) delete []s; cout<<"调用了析构函数"<<'\n'; } void display() { cout<<s<<endl; } stest(stest &); }; stest::stest(stest &a) { s=a.s; cout<<"调用了拷贝构造函数"<<endl; } void main() { char a[20]="avsdfes"; stest string1(a); string1.display(); // stest string2(string1); A } }
这段代码中,简单定义了类stest中有一个char *s;若无A行,程序正常,如下图右上角显示。若使用拷贝构造函数,可以看到,是第二次调用析构函数时发生的奔溃。
另外,strlen()函数求字符串长度时不包含空字符’\0’;
相关文章推荐
- C#代理类型学习记录(拷贝的代码哈哈)
- C++ 学习记录之静态变量static
- C++入门学习:构造函数,拷贝构造函数(特殊情况,浅拷贝与深拷贝),析构函数
- C++学习记录04
- 我的编程学习日志(15)--C/C++实现输出汉字拼音的首字母
- C++学习记录13--链表的简单理解
- 算法学习记录二(C++)--->字符串空格替换
- 算法学习记录三(C++)--->从尾到头打印链表每个节点的值
- OpenCV官方文档学习记录(15)
- C++ 学习记录4 -- 模板chongzai
- Java学习记录(记录一部分Java和C++区别和Java里一些比较重要的概念)--稍后会转到新浪博客
- C++学习笔记(15)——静态绑定与动态绑定
- C++学习记录(20180212)
- VS2010 C++ 学习笔记(四) 1.数据的封装 2.类外定义 3.构造函数(无参,有参,重载,初始化列表,拷贝) 4.练习
- 程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#]
- 【C++学习笔记】15_指针和const
- C++学习记录一
- C#一小时学习记录 有c++基础才行 threadpool 和IIS崩
- GeekBand学习笔记:C++三大函数:拷贝构造、拷贝赋值、析构函数
- 算法学习记录六(C++)--->获取斐波那契数列第n项