Skip to content

std::unique_ptr(C++11)

一句话

通过独占所有权语义管理动态对象生命周期的智能指针,离开作用域时自动销毁对象,且大小和原生指针完全一致。

头文件

#include <memory>

核心 API 速查

操作签名说明
创建对象template<class T> unique_ptr<T> make_unique(Args&&... args)(C++14) 异常安全地创建 unique_ptr
构造函数constexpr unique_ptr(pointer p = pointer())接管原生指针
析构函数~unique_ptr()释放所管理的对象
释放所有权pointer release() noexcept放弃所有权并返回原生指针
重置指针void reset(pointer p = pointer())释放当前对象并接管新指针
获取原生指针pointer get() const noexcept返回所管理的原生指针
检查是否为空explicit operator bool() const noexcept判断是否持有对象
解引用T& operator*() const访问被管理的对象
成员访问T* operator->() const通过指针访问成员
数组下标T& operator[](size_t i) const(数组特化) 访问数组元素

最小示例

cpp
// Standard: C++14
#include <iostream>
#include <memory>
struct Foo { ~Foo() { std::cout << "destroyed\n"; } };
int main() {
    std::unique_ptr<Foo> p = std::make_unique<Foo>();
    std::unique_ptr<Foo> q = std::move(p); // 转移所有权
    std::cout << std::boolalpha << (p == nullptr) << "\n"; // true
} // "destroyed"

嵌入式适用性:高

  • 零开销抽象:编译后与原生指针大小相同,无额外内存占用
  • 确定性析构:作用域结束时立即释放,契合嵌入式对实时性和确定性内存的要求
  • 完美支持 pImpl 惯用法,可隐藏实现细节并缩短编译依赖链
  • 不引入控制块,无 shared_ptr 的线程安全与内存碎片开销

编译器支持

GCCClangMSVC
4.42.92010

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建