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 ...
随机推荐
- Linux服务器PBS任务队列作业提交脚本的使用方法
本文介绍在Linux服务器中,通过PBS(Portable Batch System)作业管理系统脚本的方式,提交任务到服务器队列,并执行任务的方法. 最近,需要在学校公用的超算中执行代码任务 ...
- 自制基于simplefoc大功率驱动板想法的由来,同时欢迎有相同兴趣的F友一起来玩。。。
前一阵子,偶然在B站上看了一个simplefoc的介绍视频,代码简洁.算法精妙让人佩服,更让人佩服的是:开源!遂!搜索之!不搜不知道一搜吓一跳,发现太OUT了,原来玩这个算法的人这么多,让我这个整天沉 ...
- 倒装句&强调句
倒装句 你[吃][胡萝卜]了吗? 吃胡萝卜了吗,[你]? 强调点不同 汉语常见于口语表达 英语则常见于书面用语 英语的语序是 主语 谓语(动词) 通常把谓语动词提前 1.完全倒装句 谓语部分完全放在主 ...
- RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB、Dify、FastGPT、RagFlow、Anything-LLM,以及更多推荐
RAG+AI工作流+Agent:LLM框架该如何选择,全面对比MaxKB.Dify.FastGPT.RagFlow.Anything-LLM,以及更多推荐 1.MaxKB MaxKB = Max Kn ...
- Anaconda Navigator打不开
问题描述:之前安装的Anaconda Navigator,好久不用了,今天却打不开了,只有那个绿色圆环图标出现在桌面中央,点一下就没了.但jupyter notebook和Spyder可以正常使用. ...
- Jmeter参数化5-JSON提取器
后置处理器[JSON提取器] ,一般放于请求接口下面,用于获取接口返回数据里面的json参数值 1.以下json为例,接口返回的json结果有多组数据.我们要取出purOrderNo值 2.在jmet ...
- Vue打包部署到CentOS 7
项目打包 在项目目录下执行打包目录进行打包 yarn build // 或者 npm run build 打包完成后会生成一个dist文件夹,这样就打包完成了(我这样做了SEO的,所有目录结构有点不一 ...
- (一)MOngoDB的安装与配置(Windows和Centos)
其实Windows的安装没有什么难的,主要是后的Centos下的安装,我是在centos7上安装测试的,不管是手动安装还是脚本安装我都是成功才发出来的,有什么的问题可以留言,写博客只是为了记录和简单的 ...
- 【Spring Data JPA】10 对象导航查询
定义: 查询一个记录时,也就是查询这个对象,通过这个对象查询他的关联对象 [说白了不就是从我们设置好的集合中获取不就完了吗] 环境搭建: INSERT INTO `jpa`.`cst_customer ...
- Jenkins API用户认证方式
1.概述 Jenkins的API可以通过用户名+密码或者用户名+Token的方式来进行认证,这篇文章以具体示例来说明具体的使用方式. 2.Jenkins环境 本文示例基于Jenkins 2.452.3 ...