深拷贝实现
#include <iostream>
#include <cstring>
class SubClass {
private:
int* data;
public:
SubClass() {
data = new int(0);
}
SubClass(const SubClass& other) {
data = new int(*other.data);
}
SubClass& operator=(const SubClass& other) {
if (this != &other) {
delete data;
data = new int(*other.data);
}
return *this;
}
~SubClass() {
delete data;
}
};
class ComplexClass {
private:
SubClass* subPtr;
public:
ComplexClass() {
subPtr = new SubClass();
}
ComplexClass(const ComplexClass& other) {
subPtr = new SubClass(*other.subPtr);
}
ComplexClass& operator=(const ComplexClass& other) {
if (this != &other) {
delete subPtr;
subPtr = new SubClass(*other.subPtr);
}
return *this;
}
~ComplexClass() {
delete subPtr;
}
};
浅拷贝问题
- 双重释放:浅拷贝时,
ComplexClass
对象的subPtr
指针会直接复制被拷贝对象的subPtr
指针的值,这意味着两个ComplexClass
对象中的subPtr
指针指向同一块内存。当这两个对象先后析构时,同一块SubClass
对象的内存会被释放两次,导致未定义行为。
- 悬挂指针:如果一个
ComplexClass
对象析构后,另一个ComplexClass
对象的subPtr
指针仍然指向已经释放的内存,这就产生了悬挂指针。当使用这个悬挂指针访问内存时,会导致程序崩溃或未定义行为。