unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。 unique_ptr具有->和*运算符重载符,因此它可以像普通指针一样使用。 查看下面的示例: #include #include struct Task { int mId; Task(int id ) :mId(id) { std::cout taskPtr(new Task(23)); //通过 unique_ptr 访问其成员 int id = taskPtr->mId; std::cout 对象 taskPtr 接受原始指针作为参数。现在当main函数退出时,该对象超出作用范围就会调用其析构函数,在unique_ptr对象taskPtr 的析构函数中,会删除关联的原始指针,这样就不用专门delete Task对象了。 这样不管函数正常退出还是异常退出(由于某些异常),也会始终调用taskPtr的析构函数。因此,原始指针将始终被删除并防止内存泄漏。 unique_ptr 独享所有权 unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。 由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。 创建一个空的 unique_ptr 对象 创建一个空的unique_ptr对象,因为没有与之关联的原始指针,所以它是空的。 std::unique_ptr ptr1; 检查 unique_ptr 对象是否为空 有两种方法可以检查 unique_ptr 对象是否为空或者是否有与之关联的原始指针。 // 方法1 if(!ptr1) std::cout taskPtr(new Task(22)); 或者(这种新学到的) std::unique_ptr taskPtr(new std::unique_ptr::element_type(23)); 不能通过赋值的方法创建对象,下面的这句是错误的 // std::unique_ptr taskPtr2 = new Task(); // 编译错误 使用 std::make_u