基于作用域的内存管理

构造函数和析构函数让你可以钩入对象的生命周期。

通过将指针封装在对象中,你可以在该对象 被销毁时释放内存。编译器可保证这一点的实现,即使引发了异常也不例外。

这通常称为“资源获取即初始化 (resource acquisition is initialization, RAII)”, 并为你提供智能指针。

C++ 示例

void say_hello(std::unique_ptr<Person> person) {
  std::cout << "Hello " << person->name << std::endl;
}
  • std::unique_ptr 对象在栈上分配内存,并指向在堆上分配的内存。
  • say_hello 结束时,std::unique_ptr 析构函数将运行。
  • 析构函数释放它所指向的 Person 对象。

将所有权传递给函数时,使用特殊的 move 构造函数:

std::unique_ptr<Person> person = find_person("Carla");
say_hello(std::move(person));