智能指针派什么用场?
在 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 与自制雏形
RAII(Resource Acquisition Is Initialization)这个模式把资源的生命周期和对象的生命周期绑在一起:构造时获取资源,析构时释放。不光内存,文件句柄、锁、套接字都可以这么管。为了让智能指针用起来像原生指针,通常还会重载 operator*、operator-> 和 operator[]。
template<class T>
class SmartPtr {
public:
SmartPtr(T* ptr) : _ptr(ptr) {}
~SmartPtr() {
delete[] _ptr;
std::cout << << std::endl;
}
T& *() { *_ptr; }
T* ->() { _ptr; }
T& []( i) { _ptr[i]; }
:
T* _ptr;
};


