主页 > 创业  > 

《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》

《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》

目录

一、默认拷贝构造函数的陷阱(浅拷贝)

二、自定义拷贝构造函数(深拷贝)

三、深拷贝与浅拷贝对比

四、注意事项


一、默认拷贝构造函数的陷阱(浅拷贝) class MyString { private: char* ptr; // 指向动态分配的内存 public: // 默认拷贝构造函数(按位拷贝) MyString(const MyString &st) : ptr(st.ptr) {} // 浅拷贝:仅复制指针地址 };

问题分析:

浅拷贝本质:直接复制指针值,新旧对象共享同一块内存。

致命缺陷:

重复释放:析构时多个对象尝试释放同一内存,导致崩溃。

悬空指针:一个对象释放内存后,其他对象指针失效。

数据篡改:通过任意对象修改内容,影响所有共享对象。


二、自定义拷贝构造函数(深拷贝) class MyString { private: char* ptr; public: // 构造函数:动态分配内存 MyString(const char* str = nullptr) { if (str) { int len = strlen(str); ptr = new char[len + 1]; strcpy(ptr, str); } else { ptr = new char[1]; *ptr = '\0'; } } // 深拷贝构造函数 MyString(const MyString& st) { if (st.ptr) { int len = strlen(st.ptr); ptr = new char[len + 1]; // 独立分配新内存 memcpy(ptr, st.ptr, len + 1); // 复制内容而非指针(比strcpy更高效) } else { ptr = nullptr; // 处理空指针边界条件 } } // 析构函数:安全释放内存 ~MyString() { delete[] ptr; // delete[] 匹配 new[] ptr = nullptr; // 避免悬空指针 } };

关键改进:

独立内存分配:每个对象持有独立内存块。

内容复制:使用memcpy或strcpy确保数据完整性。

边界处理:明确处理空指针输入场景。


三、深拷贝与浅拷贝对比 特性浅拷贝深拷贝内存共享是(多个对象指向同一内存)否(每个对象拥有独立内存)安全性低(重复释放/悬空指针)高(内存隔离)适用场景无动态内存管理的简单类型(如int)含指针/动态资源的类(如字符串)实现复杂度自动生成(无需编码)需显式实现拷贝构造/赋值运算符
四、注意事项

三人行 若自定义拷贝构造函数、拷贝赋值运算符或析构函数中的一个,必须显式实现三者。

优先使用std::string: 避免手动管理内存,直接利用标准库的深拷贝能力。

深拷贝工具优化:

使用memcpy替代strcpy提升大内存块复制效率。

添加nullptr检查防止未定义行为。

标签:

《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“《C++深拷贝与浅拷贝:内存安全的拷贝构造函数实践》