析构函数是面向对象编程中的一个特殊成员函数,当对象生命周期结束时自动调用,用于释放对象占用的资源。在C++中,析构函数名与类名相同,前面加波浪号(~)。
class MyClass {
public:
int* data;
MyClass() { data = new int[100]; }
~MyClass() { delete[] data; }
};
// 错误示例:拷贝构造函数未正确处理指针
MyClass a;
MyClass b = a; // 浅拷贝,析构时会双重释放
修复方法:
class MyClass {
public:
int* data;
MyClass() { data = new int[100]; }
// 实现拷贝构造函数
MyClass(const MyClass& other) {
data = new int[100];
std::copy(other.data, other.data+100, data);
}
~MyClass() { delete[] data; }
};
class Base {
public:
~Base() {} // 非虚析构函数
};
class Derived : public Base {
public:
int* arr;
Derived() { arr = new int[100]; }
~Derived() { delete[] arr; }
};
Base* b = new Derived();
delete b; // 只调用Base的析构函数,导致内存泄漏
修复方法:
class Base {
public:
virtual ~Base() {} // 虚析构函数
};
class ResourceHolder {
public:
~ResourceHolder() {
// 如果这里抛出异常,可能导致资源泄漏
cleanup(); // 可能抛出异常
}
};
修复方法:
class ResourceHolder {
public:
~ResourceHolder() noexcept {
try {
cleanup();
} catch (...) {
// 记录日志,但不抛出异常
}
}
};
std::unique_ptr
和std::shared_ptr
自动管理资源通过以上方法和实践,可以有效地预防和解决析构函数崩溃的问题。