文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中深拷贝与浅拷贝有什么区别

2023-06-14 12:20

关注

这篇文章将为大家详细讲解有关C++中深拷贝与浅拷贝有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

浅拷贝

只是对指针的拷贝,拷贝后两个指针指向同一个内存空间;

深拷贝

对指针指向的内容进行拷贝(重新分配内存),经深拷贝后的指针是指向不同地址的指针;

因此浅拷贝释放内存的时候很容易出现因为释放两个指针而内存出错。

浅拷贝(释放时,因为多次释放出错)

只拷贝指针

//拷贝构造函数Vector(const Vector<T>& v):_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){_start=v._start;_finish=v._finish;_endOfStorage=v._endOfStorage;}

深拷贝

对资源进行拷贝

 Vector(const Vector<T>& v):_start(nullptr), _finish(nullptr), _endOfStorage(nullptr){size_t n = v.capacity();_start = new T[n];for (size_t i = 0; i < v.size(); ++i){_start[i] = v[i];}_finish = _start + v.size();_endOfStorage = _start + n;}

写一个Vector的类

 template<class T>class Vector{typedef T* operator;typedef const T* const_iterator;iterator _start;iterator _finish;iterator _endOfStorage; public://构造函数 Vector():_start(nullptr), _finish(nullptr), _endOfStorage(nullptr){}//析构函数~Vector(){if(_start){delete[] _start;_star=_finish=_endOfStorage=nullptr;}}T& operator[](size_t pos){if (pos >= 0 && pos < size())return _start[pos];}size_t size() const{return _finish - _start;} size_t capacity() const{return _endOfStorage - _start;}};

可以用自己编辑器,把拷贝放进去试试;

附:c++深拷贝与浅拷贝问题实例

浅拷贝:简单的赋值拷贝操作;

深拷贝:在堆区重新申请空间,再进行拷贝操作;

问题:浅拷贝会带来堆区内存被重复释放的问题,析构函数被调用多次,导致程序运行崩溃;

解决:通过深拷贝解决,在堆区重新申请内存,各自释放自己的内存,避免重复释放;

#include <iostream>using namespace std;class Person{public:    Person() {        cout << "Person的默认构造函数调用"<<endl;    }    Person(int age,int height) {        m_Age = age;        m_Height = new int(height);//堆区重新申请空间,进行深拷贝,手动申请,手动释放;        cout << "Person的有参函数调用" << endl;    }    int m_Age;    int *m_Height;    //自己实现拷贝构造函数,来避免编译器的拷贝构造函数造成浅拷贝问题;    Person(const Person& p) {        cout << "Person拷贝构造函数" << endl;        m_Age = p.m_Age;        //m_Height = p.m_Height; 浅拷贝,编译器默认实现这行代码;        m_Height = new int(*p.m_Height);//深拷贝    }    ~Person() {        //析构代码,将堆区开辟数据做释放操作        if (m_Height != NULL) {            delete m_Height;            m_Height = NULL;        }        cout << "Person的析构函数调用" << endl;    }};void test01(){    Person p1(18,160);    cout << "p1的年龄为:" << p1.m_Age<<"p1身高为:"<<*p1.m_Height<< endl;    Person p2(p1);//编译器默认调用拷贝构造函数,进行浅拷贝操作    cout << "p2的年龄为:" << p2.m_Age<< "p2身高为:"<<*p2.m_Height << endl;}int main(){    test01();    system("pause");}

程序运行结果:

C++中深拷贝与浅拷贝有什么区别

关于C++中深拷贝与浅拷贝有什么区别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯