手动 new 的缺陷
如果我们自己 new 堆内存,需要在合适的地方释放内存,如果忘记会导致内存泄漏。这在大型项目中是严重的问题:若在不常调用的地方泄漏,服务器可能在启动后几周或几个月突然崩溃;若在常调用处,可能几天或几周就崩溃,带来巨大经济损失。因此应避免写出内存泄漏的代码。
即使有强烈的 delete 意识,在复杂情况下仍可能疏忽,例如抛异常时。先 new 了 n 个对象,中途未 delete 就抛异常,需在异常处理中释放内存,若异常提前抛出其他地方还需额外计算。因此需要一种让系统管理内存的方式。
析构函数管理资源释放
利用析构函数特点:当前类生命周期结束后自动执行。创建一个类管理创建的指针,在当前作用域结束后自动释放内存。
#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&;
public:
autoPtr(T* ptr = ) : _ptr(ptr) {}
~() {
(_ptr) {
cout << << endl;
_ptr;
}
}
Ref *() {
(!_ptr) std::();
*_ptr;
}
Ptr ->() {
_ptr;
}
{
_ptr != ;
}
:
Ptr _ptr = ;
};


