智能值针初始化方式

智能指针的初始化方式根据智能指针的类型(如 std::shared_ptr 或 std::unique_ptr)以及具体需求而有所不同。以下是详细介绍:


1. 初始化 std::shared_ptr

std::shared_ptr 是一种引用计数智能指针,允许多个 shared_ptr 共享同一块内存。

(1)使用 std::make_shared(推荐)

std::make_shared 是初始化 std::shared_ptr 的最佳方式:

  • 它会在单次内存分配中完成对象和引用计数控制块的分配,效率更高。
  • 避免了手动使用 new 的安全隐患。
std::shared_ptr<int> ptr = std::make_shared<int>(42);
std::cout << *ptr << std::endl;  // 输出 42

如果对象有构造函数参数,可以传递给 std::make_shared

struct Foo {
    int x, y;
    Foo(int a, int b) : x(a), y(b) {}
};

std::shared_ptr<Foo> ptr = std::make_shared<Foo>(10, 20);
std::cout << ptr->x << ", " << ptr->y << std::endl;  // 输出 10, 20

(2)使用构造函数直接初始化

可以通过 std::shared_ptr 的构造函数直接初始化,传递一个原始指针(不推荐手动管理 new)。

std::shared_ptr<int> ptr(new int(42));  // 原始指针
std::cout << *ptr << std::endl;  // 输出 42

注意:
手动使用 new 时,要确保该对象不会同时被另一个指针管理,否则可能导致未定义行为。


(3)从另一个 std::shared_ptr 初始化

  • 拷贝构造:增加引用计数。
  • 移动构造:转移所有权。
std::shared_ptr<int> ptr1 = std::make_shared<int>(42);

// 拷贝构造
std::shared_ptr<int> ptr2 = ptr1;  // 引用计数 +1

// 移动构造
std::shared_ptr<int> ptr3 = std::move(ptr1);  // ptr1 不再管理对象

2. 初始化 std::unique_ptr

std::unique_ptr 是独占所有权的智能指针,不允许拷贝,仅支持移动操作。

(1)使用 std::make_unique(推荐)

std::make_unique 是初始化 std::unique_ptr 的最佳方式,简单高效:

std::unique_ptr<int> ptr = std::make_unique<int>(42);
std::cout << *ptr << std::endl;  // 输出 42

与 std::make_shared 类似,可以传递构造函数参数:

struct Foo {
    int x, y;
    Foo(int a, int b) : x(a), y(b) {}
};

std::unique_ptr<Foo> ptr = std::make_unique<Foo>(10, 20);
std::cout << ptr->x << ", " << ptr->y << std::endl;  // 输出 10, 20

(2)使用构造函数直接初始化

直接传递一个动态分配的原始指针:

std::unique_ptr<int> ptr(new int(42));
std::cout << *ptr << std::endl;  // 输出 42

注意: 这种方式不推荐,因为与 std::make_unique 相比,手动使用 new 更容易出错。


(3)从另一个 std::unique_ptr 初始化

只能通过移动构造或移动赋值从另一个 std::unique_ptr 初始化,不能拷贝。

std::unique_ptr<int> ptr1 = std::make_unique<int>(42);

// 移动构造
std::unique_ptr<int> ptr2 = std::move(ptr1);  // ptr1 不再管理对象

3. 初始化 std::weak_ptr

std::weak_ptr 是一种弱引用智能指针,不能直接管理对象,而是从一个 std::shared_ptr 初始化。

std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr = sharedPtr;  // 弱引用,不增加引用计数

4. 空指针初始化

智能指针可以初始化为一个空指针,用于后续赋值。

std::shared_ptr

std::shared_ptr<int> ptr;  // 初始化为空
if (!ptr) {
    std::cout << "ptr is null" << std::endl;
}

std::unique_ptr

std::unique_ptr<int> ptr;  // 初始化为空
if (!ptr) {
    std::cout << "ptr is null" << std::endl;
}

5. 总结推荐方式

智能指针类型推荐初始化方式示例
std::shared_ptr std::make_shared std::shared_ptr<int> ptr = std::make_shared<int>(42);
std::unique_ptr std::make_unique std::unique_ptr<int> ptr = std::make_unique<int>(42);
std::weak_ptr 从 std::shared_ptr 初始化 std::weak_ptr<int> ptr = sharedPtr;

始终优先使用 std::make_shared 和 std::make_unique,以确保更高效、更安全的内存管理。

posted @   海_纳百川  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2023-11-30 解决pillow对png图进行旋转后区域变大的问题
2023-11-30 训练CV模型常用的技巧
本站总访问量8959109
 
点击右上角即可分享
微信分享提示