std::make_shared
std::make_shared 是 C++11 引入的一个标准库函数,用于创建一个 std::shared_ptr,并在堆上分配所需的对象。
它的功能是将对象的创建和 shared_ptr 的初始化合并在一起,提高了效率和安全性。
使用方法:
auto ptr = std::make_shared<T>(args...);
- T: 共享指针所管理的对象的类型。
- args...: 传递给
T构造函数的参数。
特点:
- 高效:
std::make_shared会在一次内存分配中同时为对象和引用计数器分配空间,减少了单独使用new和std::shared_ptr时可能需要的两次内存分配。 - 安全:减少了手动
new对象带来的内存泄漏风险,不需要显式delete,因为shared_ptr会自动管理对象的生命周期。 - 简洁:相比于直接使用
new,它使代码更加简洁明了。
例子:
#include <iostream>
#include <memory>
struct MyClass {
int value;
MyClass(int v) : value(v) {
std::cout << "MyClass constructor\n";
}
~MyClass() {
std::cout << "MyClass destructor\n";
}
};
int main() {
// 使用 make_shared 创建 shared_ptr
std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(42);
std::cout << "Value: " << ptr->value << std::endl;
return 0;
}
输出:
MyClass constructor
Value: 42
MyClass destructor
优点:
- 性能:减少了内存分配和释放次数,提升了性能。
- 简洁:避免手动使用
new和delete,代码更加清晰易懂。 - 安全:自动管理内存,避免内存泄漏。
与 new 的区别:
// 使用 new 和 shared_ptr
std::shared_ptr<T> ptr(new T(args...));
// 使用 make_shared
auto ptr = std::make_shared<T>(args...);
区别:
make_shared在堆上分配对象和引用计数器时只进行一次内存分配,而new和shared_ptr组合时是两次内存分配。make_shared更加安全,因为shared_ptr的构造和对象的分配是一体的,避免了潜在的内存泄漏风险。
因此,std::make_shared 是推荐的方式,除非在特定场景下需要精细控制对象的构造或内存管理。****
std::make_shared的更多相关文章
- Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_s ...
- std::shared_ptr(二)
Defined in header <memory> template< class T > class shared_ptr; (since C++11) ...
- tolua 转换 std::shared_ptr
tolua 转换 std::shared_ptr 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用 std::shared_ptr<Tst_ShareTe ...
- Item 25: 对右值引用使用std::move,对universal引用则使用std::forward
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...
- Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...
- std::shared_ptr 和普通指针的转换
相互转化见示例 struct test { int num; string name; }; test* pTest = new test(); std::shared_ptr<test> ...
- C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)
要写个tcp server / client的博客,想着先写个c++11多线程程序.方便后面写博客使用. 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中 ...
- C++11 std::shared_ptr总结与使用
最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结.方便后续使用. std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用 ...
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- C++11中std::bind的使用
std::bind: Each argument may either be bound to a value or be a placeholder: (1).If bound to a value ...
随机推荐
- MFC的消息反射
这边我用对话框来测试mfc的消息反射 当对话框初始化完成之后,点击按钮,首先相应CDialog::OnCommand其中wpARAM(低八位nId,高八位子控件句柄) 和LPARAM(句柄) OnCo ...
- win10远程桌面连接报错:出现身份验证错误,要求的函数不受支持(CredSSP)
问题 解决办法 找到路径:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 在Syste ...
- 【SpringMVC】10 对Ajax的应用
编写一个AjaxController package cn.dai.controller; import org.springframework.web.bind.annotation.GetMapp ...
- 个人的谷歌学术主页:https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en
主页地址: https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en
- NVIDIA一直宣传的DPU是个啥东西,啥用处? —— NVIDIA BlueField-3 DPU
地址: https://www.bilibili.com/video/BV1ys4y1z7nS/ 无意间看到了些比较靠谱的解释: (来自地址:https://www.bilibili.com/vide ...
- 深度学习框架theano下的batch_norm实现代码——强化学习框架rllab
深度学习框架theano下的batch_norm实现代码--强化学习框架rllab # encoding: utf-8 import lasagne.layers as L import lasagn ...
- 在 MindSpore 中 dataset_sink_mode 的设置对算法的性能有多少影响呢???
参考代码: https://www.cnblogs.com/devilmaycry812839668/p/14971668.html dataset_sink_mode=True 时,我们可以理解是 ...
- java多线程之-自定义数据库连接池
1.背景 数据库链接池大家不陌生吧... 不多说了,直上代码... 2.连接池具体实现 1.jdbc链接的实例对象 /** * @author 姿势帝-博客园 * @address https://w ...
- maven项目打包时排除依赖包
1.背景 为了快速上传jar包到服务器,很多时候我们需要把依赖包单独独立出来,避免每次修改都传依赖包 2.实现方式 maven的pom文件,没有独立依赖包时配置如下: <build> &l ...
- SMU 2024 spring 天梯赛自主训练2
SMU 2024 spring 天梯赛自主训练2 7-1 I Love GPLT - SMU 2024 spring 天梯赛自主训练2 (pintia.cn) PHP 点击查看代码 I L o v e ...