C++ 深拷贝和浅拷贝
时间: 2023-10-24 14:04:00 浏览: 98
在C++中,对象的拷贝可以通过复制构造函数和赋值算符来实现。深拷贝和浅拷贝的概念同样适用于C++中的对象拷贝。
浅拷贝是指将一个对象的值直接赋值给另一个对象,包括对象的所有成员变量。这样,两个对象将共享相同的内存地址,如果其中一个对象修改了共享的资源,会影响到另一个对象。
例如,考虑以下示例代码:
```
class MyClass {
public:
int* data;
MyClass(const MyClass& other) {
data = other.data;
}
};
int main() {
MyClass obj1;
obj1.data = new int(42);
MyClass obj2 = obj1; // 浅拷贝
delete obj1.data; // 释放obj1的资源
cout << *obj2.data << endl; // 访问已被释放的资源,可能导致未定义行为
return 0;
}
```
在这个例子中,obj2是通过浅拷贝从obj1创建的。当我们释放obj1的资源后,obj2.data指向的内存已经被释放,访问obj2.data将导致未定义行为。
为了避免这类问题,我们可以使用深拷贝来创建新的对象,确保每个对象都有自己独立的资源。
```
class MyClass {
public:
int* data;
MyClass(const MyClass& other) {
data = new int(*other.data); // 深拷贝
}
~MyClass() {
delete data;
}
};
int main() {
MyClass obj1;
obj1.data = new int(42);
MyClass obj2 = obj1; // 深拷贝
delete obj1.data; // 释放obj1的资源
cout << *obj2.data << endl; // 安全访问已经复制的资源
return 0;
}
```
在深拷贝的例子中,我们为每个对象创建了一个独立的资源,因此即使我们释放了obj1的资源,obj2仍然可以安全地访问它自己的资源。
需要注意的是,如果一个类包含指针类型成员变量,需要在拷贝构造函数中进行深拷贝以及析构函数中释放资源,以防止内存泄漏和悬挂指针等问题。同时,还可以通过重载赋值运算符实现深拷贝。
阅读全文