手动管理堆内存的隐患
在 C++ 中,如果我们直接使用 new 分配堆内存,就必须确保在合适的时机调用 delete 释放。一旦疏忽,就会导致内存泄露。这在大型项目中是严重的隐患:若是低频调用的模块,可能数周甚至数月后服务器才崩溃;若是高频路径,几天内就可能引发故障,带来巨大的经济损失。
即便开发者有很强的 delete 意识,在复杂场景下依然容易出错。例如在抛出异常时,如果中途分配了多个对象却未释放就发生异常,必须确保异常处理逻辑能正确清理资源。若异常传播到更外层,清理逻辑会变得极其繁琐。因此,将内存管理权交给系统自动处理是更优的选择。
RAII 与析构函数
RAII(资源获取即初始化)的核心思想是利用对象的生命周期来管理资源。当对象超出作用域时,其析构函数会自动执行。我们可以封装一个类来持有指针,利用析构函数自动释放内存。
#include <iostream>
using namespace std;
template<class T>
class Autoptr {
using Ptr = T*;
using Ref = T&;
public:
Autoptr(T* ptr) : _ptr(ptr) {}
~Autoptr() {
if (_ptr) {
cout << "指针内存释放" << endl;
delete _ptr;
}
}
private:
Ptr _ptr;
};
int main() {
{
Autoptr<int> ptr(new int);
}
cout << "作用域结束" << endl;
return 0;
}
效果不错。为了更像原生指针使用,我们还可以重载操作符,使其支持解引用和成员访问。
template<class T>
class Autoptr {
using Ptr = T*;
using Ref = T&;
:
(T* ptr = ) : _ptr(ptr) {}
~() {
(_ptr) {
cout << << endl;
_ptr;
}
}
Ref *() {
(!_ptr) ();
*_ptr;
}
Ptr ->() {
_ptr;
}
{ _ptr != ; }
:
Ptr _ptr = ;
};


