热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++中浅拷贝与深拷贝的概念及应用

本文详细探讨了C++编程语言中的浅拷贝和深拷贝机制,重点分析了两者在处理对象复制时的不同行为及其潜在的风险,并通过实例代码演示了如何正确实现深拷贝以避免常见的内存管理错误。

C++中的浅拷贝与深拷贝是理解对象复制机制的关键概念。当一个对象被复制时,浅拷贝仅复制对象的数据成员的值,而不会为动态分配的资源创建新的副本;相反,深拷贝则会为每个数据成员创建全新的副本,特别是对于动态分配的资源,如指针所指向的数据。



浅拷贝示例:


#include 
#include

using namespace std;

class Student {
public:
Student() {
name = new char[10];
strcpy(name, "Default");
age = 18;
}
~Student() {
delete[] name;
cout <<"析构函数调用!" < }
// 默认的拷贝构造函数
Student(const Student& s) : age(s.age), name(s.name) {}

private:
char* name;
int age;
};

int main() {
Student s1;
Student s2 = s1; // 使用默认的拷贝构造函数
return 0;
}


上述代码中,Student 类的默认拷贝构造函数实现了浅拷贝。这导致 s1s2name 成员指向同一块内存区域。当这两个对象的生命周期结束时,它们的析构函数都会尝试释放这块内存,从而引发双重释放错误。



深拷贝示例:


#include 
#include

using namespace std;

class Student {
public:
Student() {
name = new char[10];
strcpy(name, "Default");
age = 18;
}
~Student() {
delete[] name;
cout <<"析构函数调用!" < }
// 自定义的深拷贝构造函数
Student(const Student& s) : age(s.age) {
name = new char[10];
strcpy(name, s.name);
}

private:
char* name;
int age;
};

int main() {
Student s1;
Student s2 = s1; // 使用自定义的深拷贝构造函数
return 0;
}


在这个版本中,我们为 Student 类提供了一个自定义的拷贝构造函数,该构造函数实现了深拷贝。这意味着 s2name 成员会被分配新的内存,并且内容会被从 s1name 成员复制过来,从而避免了浅拷贝带来的问题。



补充说明:



  • 赋值运算符(=)也可以重载来实现深拷贝,确保对象的正确复制。

  • 对于标准库中的 std::string 类型,使用赋值运算符已经实现了深拷贝,无需额外处理。


推荐阅读
author-avatar
黑小羊Mark
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有