c++深拷贝与浅拷贝
发布日期:2021-09-25 21:41:00 浏览次数:2 分类:技术文章

本文共 1497 字,大约阅读时间需要 4 分钟。

直接看代码更直观,注释都在代码里

#include 
using namespace std;//浅拷贝democlass A{public: ~A() { cout << "A析构函数" << endl; } A() :m_num(0){} void setNum(int num){ m_num = num; } int getNum() { return m_num; }private: int m_num;};//深拷贝demo1 内存泄漏版class B{public: B(const char *str = ""){ cout << "B构造函数" << endl; m_data = new char[strlen(str) + 1]; memset(m_data, 0, strlen(str) + 1); memcpy(m_data, str, strlen(str)); } ~B(){ if (m_data) { cout << "B析构函数" << endl; delete m_data; m_data = nullptr; } } char *m_data;};//深拷贝demo2 正常版class C{public: C(const char *str=""){ cout << "C构造函数" << endl; m_data = new char[strlen(str) + 1]; cout << "sizeof(m_data)=" << sizeof(m_data) <<" sizeof(*m_data)="<
<<" strlen(str)+1="<
<< endl; memset(m_data, 0, strlen(str) + 1); memcpy(m_data, str, strlen(str)); } ~C(){ if (m_data) { cout << "C析构函数" << endl; delete m_data; m_data = nullptr; } } C(const C &c) { cout << "拷贝构造" << endl; int len = strlen(c.m_data) + 1; m_data = new char[len]; memset(m_data, 0, len); memcpy(m_data, c.m_data, strlen(c.m_data)); } char *getData() { return m_data; } char *m_data;};//客户端int main(){ //浅拷贝 没有指针的时候,不需要担心内存泄漏 A a; a.setNum(10); A a1 = a; cout << "num=" << a.getNum() << endl; //输出10 cout << "num=" << a1.getNum() << endl; //输出10 //深拷贝 崩溃版,指针指向同一块内存,析构时释放指针会被释放两次 //B b; //B b1 = b; //深拷贝 正常版 C c("123456"); cout << "c=" << c.getData() << endl; C c1 = c; cout << "c1="<
<< endl; return 0;}

效果

转载地址:https://blog.csdn.net/c_shell_python/article/details/107566055 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++之迭代器模式
下一篇:c++之职责链模式

发表评论

最新留言

不错!
[***.144.177.141]2024年04月01日 13时42分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章