C程序中有一条行规是:
谁开发谁保护,谁污染谁治理
所以我们在很多库的API中经常发现一些传递二级指针的alloc函数和一些对应的xxx_free函数,这就是遵循谁开发谁保护,谁污染谁治理的原则。
了解下RAII
RAII(Resource Acquisition Is Initialization)是由c++之父Bjarne Stroustrup提出的,中文翻译为资源获取即初始化,他说:使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存、网络套接字等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入。
堆指针在C/C++实在是太灵活,但是每次使用完毕后都需要程序员手动地去释放它,但是程序员们往往会忘记释放它,又或者是命名写了释放的代码,但是因为各种执行的异常情况,导致到释放资源的代码根本没有执行到,特别是引入了异常机制后的C++更是如此。因此为了解决这些问题,c++之父给出了解决问题的方案:
使用RAII,它充分地利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。
一句话总结起来就是在构造函数中去申请资源,在析构函数中去释放资源。
以下展示了一个简单的RAII的例子:
class Student{
public:
Student():name(new string("张三")){
}
~Student(){
// 声明周期结束自动释放指针
delete name;
name = nullptr;
}
public:
const string *name;
};
int main() {
Student student;
// delete student.name; // 不需要手动释放内部的指针
return 0;
}