智能指针的场景需求
在 C++ 开发中,如果手动使用 new 申请对象空间后发生异常,而代码未能在 catch 块中及时释放资源,就会导致内存泄漏。虽然可以在异常处理中手动调用 delete,但 new 本身也可能抛出异常,这使得资源管理的逻辑变得复杂且容易出错。智能指针正是为了解决这类场景而生。
double divide(int a, int b) {
if (b == 0) {
throw std::string("Divide by zero condition!");
} else {
return (double)a / (double)b;
}
}
void Func() {
int* arr = new int[10];
try {
divide(1, 0);
} catch (const std::string& s) {
delete[] arr;
std::cout << s << std::endl;
}
}
智能指针的设计思路
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来管理动态资源的设计思想。其本质是将资源的获取与对象的构造绑定,将资源的释放与对象的析构绑定。这里的资源不仅限于内存,还包括文件句柄、网络连接、互斥锁等。
当对象生命周期结束时,会自动调用析构函数释放资源,无需开发者手动干预,从而有效避免资源泄漏。为了让智能指针像普通指针一样方便使用,通常还需要重载 operator*、operator-> 和 operator[] 等运算符。
template<class T>
class SmartPtr {
public:
SmartPtr(T* ptr) : _ptr(ptr) {}
~SmartPtr() {
[] _ptr;
std::cout << << std::endl;
}
T& *() { *_ptr; }
T* ->() { _ptr; }
T& []( i) { _ptr[i]; }
:
T* _ptr;
};


