【C++】谈谈深拷贝与浅拷贝
2023-12-20 22:48:41
目录
一、浅拷贝
1.定义
浅拷贝是指对对象进行复制时,只是简单地复制对象中的每个成员的值,包括基本数据类型和指针。对象的指针成员被复制,但它们仍然指向相同的内存地址。
2.示例
#include <iostream>
class ShallowCopyExample {
public:
int *data;
ShallowCopyExample(int val) {
data = new int(val);
}
// 浅拷贝构造函数
ShallowCopyExample(const ShallowCopyExample &other) : data(other.data) {}
~ShallowCopyExample() {
delete data;
}
};
int main() {
ShallowCopyExample obj1(42);
ShallowCopyExample obj2 = obj1; // 浅拷贝发生在这里
std::cout << *obj1.data << std::endl; // 输出:42
std::cout << *obj2.data << std::endl; // 输出:42,因为共享相同的内存地址
// 当 obj1 被销毁时,obj2.data 指向的内存就变成了悬空指针
return 0;
}
3.问题
当两个对象共享相同的内存地址时,一个对象的改变会影响另一个对象。在销毁其中一个对象时,可能会导致悬空指针的问题。
二、深拷贝
1.定义
深拷贝是指在对象赋值时,为对象的每一个指针成员分配新的内存,新的内存内存放源对象的副本。两个对象相互独立,对一个对象的修改不会影响到另一个对象。
2.示例
#include <iostream>
class DeepCopyExample {
public:
int *data;
DeepCopyExample(int val) {
data = new int(val);
}
// 深拷贝构造函数
DeepCopyExample(const DeepCopyExample &other) : data(new int(*(other.data))) {}
~DeepCopyExample() {
delete data;
}
};
int main() {
DeepCopyExample obj1(42);
DeepCopyExample obj2 = obj1; // 深拷贝发生在这里
std::cout << *obj1.data << std::endl; // 输出:42
std::cout << *obj2.data << std::endl; // 输出:42,因为拷贝了新的内存
// 当 obj1 被销毁时,obj2.data 不受影响
return 0;
}
3.优点
避免了浅拷贝可能导致的共享内存的问题,提高程序的安全性。并且对象是相互独立的,不会出现悬空指针和内存泄漏的问题。
注意:
- 对于包含复杂结构的对象,需要正确实现深拷贝构造函数和析构函数。
- 深拷贝可能会导致性能开销,因为需要额外的内存分配和复制操作。
三、考虑场景
深拷贝和浅拷贝的选择取决于程序的需求、数据结构的设计等等。下面是一些情况下考虑使用深拷贝或浅拷贝的情景:
浅拷贝的考虑
1.性能要求
浅拷贝通常比深拷贝更高效,因为它只是简单地复制指针而不涉及到动态内存的分配和复制。对性能要求较高的情况下,会选择浅拷贝。
2.简单地数据结构
当对象中只包含基本数据类型或者没有动态分配内存的情况喜爱,浅拷贝可能足够满足需求,并且实现起来比较简单。
3.资源管理
当使用者不希望负责对象中的资源管理时,浅拷贝可以更合适。
深拷贝的考虑
1.动态内存分配
当类中包含指针成员,并且这些指针指向动态分配的内存时,通常考虑使用深拷贝,以避免对个对象共享相同的内存地址。
2.复杂数据结构
当对象包含复杂的结构、子对象或容器时,深拷贝可以确保所以层次的数据都能正确地进行复制。
3.资源管理
当使用者需要负责管理对象中的资源时,深拷贝通常是更合适的选择,因为它将资源的控制权交给了拷贝的对象。
总结
总的来说,深拷贝是一种更安全的拷贝方式,尤其在涉及到动态内存分配时,可以避免悬空指针和内存泄漏的问题。不过,具体选择深拷贝还是浅拷贝取决于具体的需求和对象的结构,有的情况下选择浅拷贝会更合适。
文章来源:https://blog.csdn.net/dhgiuyawhiudwqha/article/details/135117784
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!