浅拷贝和深拷贝概念
- 浅拷贝:
- 浅拷贝是指在拷贝对象时,只复制对象中的基本数据类型成员变量的值,而对于指针类型的成员变量,只是简单地复制指针的值(即内存地址),而不是复制指针所指向的内存空间中的数据。这就导致多个对象的指针成员指向同一块内存空间。
- 深拷贝:
- 深拷贝不仅复制对象中的基本数据类型成员变量的值,对于指针类型的成员变量,会重新分配一块新的内存空间,并将原指针所指向的内存空间中的数据复制到新分配的内存空间中。这样每个对象都有自己独立的内存空间,相互之间不会影响。
代码示例
- 浅拷贝示例:
#include <iostream>
using namespace std;
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(10);
ShallowCopy obj2(obj1);
cout << "obj1 data: " << *obj1.data << endl;
cout << "obj2 data: " << *obj2.data << endl;
// 修改obj1的数据
*obj1.data = 20;
cout << "After modifying obj1, obj2 data: " << *obj2.data << endl;
return 0;
}
- 深拷贝示例:
#include <iostream>
using namespace std;
class DeepCopy {
public:
int *data;
DeepCopy(int value) {
data = new int(value);
}
// 深拷贝构造函数
DeepCopy(const DeepCopy& other) {
data = new int(*other.data);
}
~DeepCopy() {
delete data;
}
};
int main() {
DeepCopy obj1(10);
DeepCopy obj2(obj1);
cout << "obj1 data: " << *obj1.data << endl;
cout << "obj2 data: " << *obj2.data << endl;
// 修改obj1的数据
*obj1.data = 20;
cout << "After modifying obj1, obj2 data: " << *obj2.data << endl;
return 0;
}
浅拷贝可能引发的问题
- 内存释放问题:
- 在上述浅拷贝示例中,
obj1
和obj2
的data
指针指向同一块内存。当obj1
和obj2
先后析构时,会对同一块内存进行两次delete
操作,这会导致程序崩溃。因为一旦obj1
析构释放了内存,obj2
的data
指针就成为了野指针,再次释放会引发未定义行为。
- 数据一致性问题:
- 由于
obj1
和obj2
的data
指针指向同一块内存,修改obj1
的数据会影响obj2
的数据,如上述示例中修改obj1
的数据后,obj2
的数据也跟着改变,这可能不符合程序的预期逻辑。