浅拷贝与深拷贝
来源:互联网 发布:mysql当前时间减一天 编辑:程序博客网 时间:2024/06/10 23:52
在C++中,如果不显示声明拷贝构造函数的话,C++编译器会提供一个默认拷贝构造函数,这里的默认拷贝构造函数形成的效果就是浅拷贝。
浅拷贝的意思即:如果是指针变量的话,只是将指针变量的内存地址复制给新对象中的指针变量,并未将指针指向的对象重新开辟内存空间,这样留下后患,形成野指针现象。
通过程序测试如下:
Name(const char *myp)//构造函数{m_len = strlen(myp);m_p = (char *)malloc(m_len + 1);strcpy(m_p, myp);}~Name()//析构函数{if (m_p != NULL){free(m_p);m_p = NULL;m_len = 0;}}//对象析构的时候 出现coredumpvoid objplaymain(){Name obj1("abc");Name obj2 = obj1; //C++编译器提供的默认的copy构造函数,即浅拷贝}
下面提供一张图示以加强理解。
注:当调用类似Name obj2=obj1;时,并未调用构造函数,只是调用了拷贝构造函数。
当调用类似Name obj2; obj2=obj1;时,调用了构造函数,生成了obj2对象,但是赋值时,还是浅拷贝。
想要从根本上解决浅拷贝问题,就要显示提供拷贝构造函数,以及重载=操作符。代码如下。
//解决方案: 手工的编写拷贝构造函数 使用深copyName(const Name& obj1){m_len = obj1.m_len;m_p = (char *)malloc(m_len + 1);strcpy(m_p, obj1.m_p);}以后的编程生涯中,记住这两点对程序的正确性来说,是至关重要的。
0 0
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- “浅拷贝”与“深拷贝”
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 浅拷贝与深拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- 深拷贝与浅拷贝
- nil、Nil、NULL、NSNull的区别
- 白帽学院菜鸟做题过程
- 【ACM】1043:字符串排序
- @RequestParam
- nyoj 1100 WAJUEJI which home strong!(广搜)
- 浅拷贝与深拷贝
- HINSTANCE/HWND/CWnd/HANDLE 的区别
- eclipse 常用快捷键
- Servlet之ServletConfig
- Android-Mac电脑如何进行APK反编译-使用apktool、jd-gui
- 【ACM】1044:最小最大数兑换
- 提交App在ios9中的问题
- iOS/iphone开发如何为苹果开发者帐号APPID续费
- iOS UITextFieldDelegate 几个简单常见用法