在C++中,深拷贝和浅拷贝是两种不同的对象复制方式。它们的区别在于如何处理对象中的动态分配内存和指针成员。
浅拷贝
浅拷贝是指直接复制对象的所有成员的值,包括指针成员。浅拷贝不会复制指针所指向的内存块,而只是复制指针的值。这意味着两个对象共享同一块内存。如果一个对象释放了内存,另一个对象将指向无效的内存地址,这可能导致悬空指针问题和程序崩溃。
示例代码:
#include <iostream>
class ShallowCopy {
public:
int* data;
ShallowCopy(int value) {
data = new int(value);
}
// 默认的拷贝构造函数执行浅拷贝
ShallowCopy(const ShallowCopy& other) : data(other.data) {}
~ShallowCopy() {
delete data;
}
};
int main() {
ShallowCopy obj1(42);
ShallowCopy obj2 = obj1; // 执行浅拷贝
std::cout << "obj1 data: " << *obj1.data << std::endl;
std::cout << "obj2 data: " << *obj2.data << std::endl;
*obj1.data = 100;
std::cout << "After modification, obj1 data: " << *obj1.data << std::endl;
std::cout << "After modification, obj2 data: " << *obj2.data << std::endl;
return 0;
}
在上述代码中,obj1
和obj2
共享同一块内存,因此修改obj1
的data
也会影响obj2
的data
。
深拷贝
深拷贝是指不仅复制对象的所有成员的值,还会复制指针所指向的内存块。这意味着每个对象都有自己的独立副本,不会互相影响。深拷贝需要在拷贝构造函数和赋值运算符中手动实现。
示例代码:
#include <iostream>
class DeepCopy {
public:
int* data;
DeepCopy(int value) {
data = new int(value);
}
// 深拷贝构造函数
DeepCopy(const DeepCopy& other) {
data = new int(*other.data);
}
// 深拷贝赋值运算符
DeepCopy& operator=(const DeepCopy& other) {
if (this == &other) {
return *this;
}
delete data;
data = new int(*other.data);
return *this;
}
~DeepCopy() {
delete data;
}
};
int main() {
DeepCopy obj1(42);
DeepCopy obj2 = obj1; // 执行深拷贝
std::cout << "obj1 data: " << *obj1.data << std::endl;
std::cout << "obj2 data: " << *obj2.data << std::endl;
*obj1.data = 100;
std::cout << "After modification, obj1 data: " << *obj1.data << std::endl;
std::cout << "After modification, obj2 data: " << *obj2.data << std::endl;
return 0;
}
在上述代码中,obj1
和obj2
拥有独立的内存副本,因此修改obj1
的data
不会影响obj2
的data
。
选择使用哪种拷贝
- 浅拷贝适用于简单的类或对象,这些对象不包含动态分配的资源。
- 深拷贝适用于包含动态分配内存或需要独立资源副本的复杂对象。
为了避免浅拷贝带来的问题,C++11引入了移动语义,通过移动构造函数和移动赋值运算符优化资源管理。
标签:,obj1,int,ShallowCopy,DeepCopy,拷贝,data From: https://www.cnblogs.com/keye/p/18330460