深拷贝和浅拷贝
来源:互联网 发布:澳洲国立大学博士知乎 编辑:程序博客网 时间:2024/06/15 08:43
深拷贝:
当对象中含有指针域的时候,在对象之间进行初始化(即调用对象的拷贝构造函数)或者是 = 操作符的时候,将对象内的指针所包含的内存空间中的内容也进行拷贝。
浅拷贝:
当对象中含有指针域的时候,在对象之间进行初始化(即调用对象的拷贝构造函数)或者是 = 操作符的时候,单纯的将指针的值(也就是所指内存空间的首地址)进行拷贝。这就导致两个对象的指针域是同一块内存空间,所以在对象生命周期完毕时,调用析构函数,释放内存的时候会出现code down的情况
原因分析:
因为C++默认的拷贝构造函数和 = 操作都是浅拷贝操作,即只是将指针进行赋值解决方案:
重写类的拷贝构造函数 和 = 运算符
需要注意的点:1. 深拷贝和浅拷贝发生发生在类成员中包含有指针域的时候。
2. =操作符和对象的初始化是两种不同的东西!
3. 特别注意:在进行等号操作重载的时,先将原来的内存空间释放,(内存泄漏)
内存图:
示例代码:
#include<iostream>using namespace std;class Student{public:Student(char *name){m_len = strlen(name) + 1;m_name = new char[m_len];strcpy(m_name, name);}// 拷贝构造函数// Student s2 = s2; Student(const Student &obj){m_len = obj.m_len;m_name = new char[m_len];strcpy(m_name,obj.m_name);}// = 会造成内存泄漏void operator=(Student &obj){// 释放之前的内存空间if (obj.m_name!=NULL){delete m_name;m_name = NULL;m_len = 0;}// 重新分配内存空间m_len = obj.m_len;m_name = new char[obj.m_len];strcpy(m_name,obj.m_name);}~Student(){if (NULL!=m_name){delete m_name;m_name = NULL;m_len = 0;}}private:char*m_name;intm_len;};void Copy(){Student s1("abc");Student s2 = s1; // 用一个对象去初始化另一个新的同类型对象// 析构时,先析构s2,后析构s1,此时出现core down// = 会造成内存泄漏Student s3("");s3 = s1;}int main(void){// Copy();char *p = new char[4];strcpy(p,"abc");cout << p << endl;int a = 0;return 0;}
阅读全文
0 0
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝 和 浅拷贝
- 浅拷贝和深拷贝
- 浅拷贝和深拷贝
- 深拷贝和浅拷贝
- 深拷贝和浅拷贝
- 畅通工程之局部最小花费问题(35 分)
- gamemaker学习笔记:提取runtime的地址
- dp复习
- 排座位(25 分)
- 2016年,上海的互联网企业是否值得加入?
- 深拷贝和浅拷贝
- JQuery遍历json数组的3种方法
- javascript引用自身属性
- 13.k-means聚类,混合高斯,EM算法
- 设计模式学习笔记
- 文章标题
- 输出1-64二进制中1位奇数个的二进制代码
- PyQt5学习教程16:文件打开对话框的使用
- VIM高级配置III#YouCompleteMe