std::unique_ptr学习笔记
1. 基本概念
std::unique_ptr
是C++11标准引入的一种智能指针,用于管理动态分配的对象,并在对象不再需要时自动释放其所占用的内存。与传统的裸指针相比,std::unique_ptr
具有独特的特点,可以在不需要手动管理内存的情况下确保内存安全。
2. 内部原理
std::unique_ptr
的内部原理主要涉及以下几个方面:
-
所有权语义:
std::unique_ptr
实现了独占式拥有(Exclusive Ownership)语义,即一个std::unique_ptr
对象可以拥有对其所指向对象的唯一所有权。当一个std::unique_ptr
对象离开其作用域时,它所拥有的对象会被自动释放,从而避免内存泄漏。 -
移动语义:
std::unique_ptr
支持移动语义,允许资源的所有权从一个std::unique_ptr
对象转移至另一个对象。这样可以避免不必要的内存复制,提高程序的性能和效率。 -
空指针检查:
std::unique_ptr
内部通过空指针来表示空对象(即不拥有任何资源),并且提供了成员函数get()
用于获取所管理的指针。在访问被管理的指针前,通常需要使用get()
函数进行空指针检查,以确保指针的有效性。 -
自定义删除器:
std::unique_ptr
允许用户指定一个自定义的删除器(Deleter),用于在释放资源时执行特定的清理操作。这使得std::unique_ptr
可以灵活地管理各种类型的资源,例如动态分配的数组、文件句柄等。
3. 应用场景及示例代码
3.1 动态对象的管理
std::unique_ptr
常用于管理动态分配的对象,可以确保对象在不再需要时自动释放,避免内存泄漏。
#include <memory>
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor" << std::endl; }
~MyClass() {
std::cout << "MyClass destructor" << std::endl; }
void DoSomething() {
std::cout << "Doing something..." << std::endl; }
};
int main() {
std::unique_ptr<MyClass></