class MyClass {
private:
int* data;
public:
MyClass(int size) {
data = new int[size];
}
// 拷贝构造函数
MyClass(const MyClass& other) {
int size = sizeof(other.data) / sizeof(other.data[0]);
data = new int[size];
for (int i = 0; i < size; i++) {
data[i] = other.data[i];
}
}
~MyClass() {
delete[] data;
}
};
动态资源管理注意事项及避免问题
- 深拷贝:需要为新对象的
data
重新分配内存,并将源对象data
中的数据逐个复制到新分配的内存中,避免浅拷贝。浅拷贝会导致新对象和原对象共享data
指针,当其中一个对象销毁data
时,另一个对象的data
指针就会变成野指针,访问野指针会导致未定义行为。
- 内存分配成功检查:在新对象为
data
分配内存时,需要检查分配是否成功。若分配失败,new
操作符会抛出异常。可以使用try - catch
块捕获异常并进行适当处理,否则程序可能会因为内存分配失败而崩溃。
- 异常安全:在拷贝构造函数中,若内存分配或其他操作抛出异常,应确保已分配的资源能正确释放,避免资源泄漏。比如在上述代码中,如果在
new int[size]
之后,for
循环复制数据过程中抛出异常,那么新分配的data
内存就会泄漏。可以使用智能指针来增强异常安全性。