智能值针初始化方式
智能指针的初始化方式根据智能指针的类型(如 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
,以确保更高效、更安全的内存管理。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18578646,如有侵权联系删除
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2023-11-30 解决pillow对png图进行旋转后区域变大的问题
2023-11-30 训练CV模型常用的技巧