C++深拷贝和浅拷贝的区别
作者:野牛程序员:2023-07-21 08:30:20 C++阅读 2763
在 C++ 中,深拷贝(deep copy)和浅拷贝(shallow copy)是两种不同的对象拷贝方式。它们的主要区别在于拷贝时是否复制对象所指向的动态内存(堆内存)内容。
浅拷贝(Shallow Copy): 浅拷贝是指将一个对象的值复制到另一个对象,包括其中的成员变量。如果对象中有指向动态内存的指针或者引用,浅拷贝只会复制指针或引用的值,而不会复制指针所指向的实际数据。这意味着原对象和拷贝对象将共享同一块内存,从而可能导致两个对象在析构时尝试释放同一块内存,导致错误(悬挂指针)或内存泄漏。
示例代码:
#include <iostream>
class ShallowCopy {
public:
int* data;
ShallowCopy() {
data = new int[1];
*data = 0;
}
// 拷贝构造函数 - 浅拷贝
ShallowCopy(const ShallowCopy& other) {
data = other.data; // 仅复制指针值,而不复制数据
}
~ShallowCopy() {
delete[] data;
}
};
int main() {
ShallowCopy obj1;
obj1.data[0] = 42;
ShallowCopy obj2 = obj1; // 浅拷贝,obj1 和 obj2 共享同一块内存
std::cout << *obj1.data << std::endl; // 输出 42
std::cout << *obj2.data << std::endl; // 输出 42
obj2.data[0] = 99;
std::cout << *obj1.data << std::endl; // 输出 99,因为 obj1 和 obj2 共享同一块内存
return 0;
}深拷贝(Deep Copy): 深拷贝是指在拷贝对象时,会复制对象所指向的动态内存中的内容,而不是简单地复制指针或引用。这样,在拷贝对象后,原对象和拷贝对象将有各自独立的内存空间,彼此不会相互影响。
示例代码:
#include <iostream>
class DeepCopy {
public:
int* data;
DeepCopy() {
data = new int[1];
*data = 0;
}
// 拷贝构造函数 - 深拷贝
DeepCopy(const DeepCopy& other) {
data = new int[1]; // 创建新的内存空间
*data = *other.data; // 复制数据
}
~DeepCopy() {
delete[] data;
}
};
int main() {
DeepCopy obj1;
obj1.data[0] = 42;
DeepCopy obj2 = obj1; // 深拷贝,obj1 和 obj2 有独立的内存空间
std::cout << *obj1.data << std::endl; // 输出 42
std::cout << *obj2.data << std::endl; // 输出 42
obj2.data[0] = 99;
std::cout << *obj1.data << std::endl; // 输出 42,因为 obj1 和 obj2 有独立的内存空间
return 0;
}总结:
浅拷贝只复制指针或引用的值,而不复制指针指向的数据,导致多个对象共享同一块内存,可能带来错误和内存管理问题。
深拷贝复制指针指向的数据,创建独立的内存空间,避免对象之间的数据干扰,但可能导致额外的内存开销。
在实现自定义的类时,特别是当类中包含指针成员时,确保正确地处理拷贝构造函数和析构函数是非常重要的,以避免内存管理问题。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:c++ copy函数
- 下一篇:手机帧率是什么零件决定的呢
