String深拷贝
2016-04-16 14:20
337 查看
当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,存在崩溃的问题!这里我们要进行深拷贝。
简单的赋值浅拷贝
String S1("hello world");
String s2=s1;
s1和s2中包含的指针对象同时指向一块内存hello world,析构时delete调用两次这块内存析构两次,崩溃。因此要深拷贝
深拷贝
构造s2 时拷贝一块跟s1指向的数据块一样大小的空间,并将值拷贝下来,这样s1和s1指向各自的数据块,析构时释放各自的数据块。
简单的赋值浅拷贝
String S1("hello world");
String s2=s1;
s1和s2中包含的指针对象同时指向一块内存hello world,析构时delete调用两次这块内存析构两次,崩溃。因此要深拷贝
深拷贝
构造s2 时拷贝一块跟s1指向的数据块一样大小的空间,并将值拷贝下来,这样s1和s1指向各自的数据块,析构时释放各自的数据块。
#include<iostream> using namespace std; class String { public: char* GetStr() { return _ptr; } String(char* str = NULL) { if (str == NULL) { _ptr = new char[1]; _ptr[0] = '\0'; return; } _ptr = new char[strlen(str) + 1]; strcpy(_ptr, str); } void Swap(String& s) { char* tmp = s._ptr; s._ptr = _ptr; _ptr = tmp; } String(const String& s) :_ptr(NULL) { String tmp(s._ptr); Swap(tmp); } String& operator=(String& s) { if (this != &s) { String tmp(s._ptr); Swap(tmp); } return *this; } /*String (const String& s) :_ptr(new char[strlen(s._ptr)+1]) { strcpy(_ptr,s._ptr); } String& operator=(const String& s) { if(this!=&s) { delete [] _ptr; _ptr=new char[strlen(s._ptr)+1]; strcpy(_ptr,s._ptr); } return *this; }*/ ~String() { delete[] _ptr; } private: char* _ptr; }; int main() { String s1; cout << "s1" << s1.GetStr() << endl; String s2("qwer"); cout << "s2:" << s2.GetStr() << endl; String s3(s2); cout << "s3:" << s3.GetStr() << endl; s1 = s3; cout << "s1:" << s1.GetStr() << endl; return 0; }
相关文章推荐
- DL4J (DeepLearning for java)
- HTML5定义了FileReader
- 母函数(Generating function)详解(转)
- JAVA初学,对面向对象的一点理解
- Python 练习实例25
- 关于Android编程的小问题
- java Swing JTable 隐藏某列
- java基础(六),异常
- ViewFlipper实现图片的轮播
- 2016SDAU编程练习二1013
- uva11297 Census 【二维线段树】
- LeakCanary使用
- 【读评】为什么你有10年经验,但成不了专家?
- 【iOS】手动抛出异常
- 栈溢出笔记1.9 认识SEH
- 2016SDAU编程练习二1009
- 更新gradle插件,提升编译速度
- 本地缓存以及UIDocumentInteractionController的使用
- 【并发编程】java.lang.Thread.UncaughtExceptionHandler
- ubuntu 服务器版让root可登陆