std::make_shared 是 C++11 引入的一个标准库函数,用于创建一个 std::shared_ptr,并在堆上分配所需的对象。

它的功能是将对象的创建和 shared_ptr 的初始化合并在一起,提高了效率和安全性。

使用方法:

auto ptr = std::make_shared<T>(args...);
  • T: 共享指针所管理的对象的类型。
  • args...: 传递给 T 构造函数的参数。

特点:

  1. 高效std::make_shared 会在一次内存分配中同时为对象和引用计数器分配空间,减少了单独使用 newstd::shared_ptr 时可能需要的两次内存分配。
  2. 安全:减少了手动 new 对象带来的内存泄漏风险,不需要显式 delete,因为 shared_ptr 会自动管理对象的生命周期。
  3. 简洁:相比于直接使用 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

优点:

  • 性能:减少了内存分配和释放次数,提升了性能。
  • 简洁:避免手动使用 newdelete,代码更加清晰易懂。
  • 安全:自动管理内存,避免内存泄漏。

new 的区别:

// 使用 new 和 shared_ptr
std::shared_ptr<T> ptr(new T(args...)); // 使用 make_shared
auto ptr = std::make_shared<T>(args...);

区别

  1. make_shared 在堆上分配对象和引用计数器时只进行一次内存分配,而 newshared_ptr 组合时是两次内存分配。
  2. make_shared 更加安全,因为 shared_ptr 的构造和对象的分配是一体的,避免了潜在的内存泄漏风险。

因此,std::make_shared 是推荐的方式,除非在特定场景下需要精细控制对象的构造或内存管理。****

std::make_shared的更多相关文章

  1. Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_s ...

  2. std::shared_ptr(二)

    Defined in header <memory>       template< class T > class shared_ptr;   (since C++11)   ...

  3. tolua 转换 std::shared_ptr

    tolua 转换 std::shared_ptr 自从c++11以后std::shared_ptr几乎是比用的东西,经常会遇到类似如下应用 std::shared_ptr<Tst_ShareTe ...

  4. Item 25: 对右值引用使用std::move,对universal引用则使用std::forward

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 右值引用只能绑定那些有资格被move的对象上去.如 ...

  5. Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 矛盾的是,我们很容易就能创造出一个和std::shared_ptr ...

  6. std::shared_ptr 和普通指针的转换

    相互转化见示例 struct test { int num; string name; }; test* pTest = new test(); std::shared_ptr<test> ...

  7. C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)

    要写个tcp server / client的博客,想着先写个c++11多线程程序.方便后面写博客使用. 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中 ...

  8. C++11 std::shared_ptr总结与使用

    最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结.方便后续使用. std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用 ...

  9. std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题

    在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...

  10. 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 ...

随机推荐

  1. Linux服务器PBS任务队列作业提交脚本的使用方法

      本文介绍在Linux服务器中,通过PBS(Portable Batch System)作业管理系统脚本的方式,提交任务到服务器队列,并执行任务的方法.   最近,需要在学校公用的超算中执行代码任务 ...

  2. 自制基于simplefoc大功率驱动板想法的由来,同时欢迎有相同兴趣的F友一起来玩。。。

    前一阵子,偶然在B站上看了一个simplefoc的介绍视频,代码简洁.算法精妙让人佩服,更让人佩服的是:开源!遂!搜索之!不搜不知道一搜吓一跳,发现太OUT了,原来玩这个算法的人这么多,让我这个整天沉 ...

  3. 倒装句&强调句

    倒装句 你[吃][胡萝卜]了吗? 吃胡萝卜了吗,[你]? 强调点不同 汉语常见于口语表达 英语则常见于书面用语 英语的语序是 主语 谓语(动词) 通常把谓语动词提前 1.完全倒装句 谓语部分完全放在主 ...

  4. 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 ...

  5. Anaconda Navigator打不开

    问题描述:之前安装的Anaconda Navigator,好久不用了,今天却打不开了,只有那个绿色圆环图标出现在桌面中央,点一下就没了.但jupyter notebook和Spyder可以正常使用. ...

  6. Jmeter参数化5-JSON提取器

    后置处理器[JSON提取器] ,一般放于请求接口下面,用于获取接口返回数据里面的json参数值 1.以下json为例,接口返回的json结果有多组数据.我们要取出purOrderNo值 2.在jmet ...

  7. Vue打包部署到CentOS 7

    项目打包 在项目目录下执行打包目录进行打包 yarn build // 或者 npm run build 打包完成后会生成一个dist文件夹,这样就打包完成了(我这样做了SEO的,所有目录结构有点不一 ...

  8. (一)MOngoDB的安装与配置(Windows和Centos)

    其实Windows的安装没有什么难的,主要是后的Centos下的安装,我是在centos7上安装测试的,不管是手动安装还是脚本安装我都是成功才发出来的,有什么的问题可以留言,写博客只是为了记录和简单的 ...

  9. 【Spring Data JPA】10 对象导航查询

    定义: 查询一个记录时,也就是查询这个对象,通过这个对象查询他的关联对象 [说白了不就是从我们设置好的集合中获取不就完了吗] 环境搭建: INSERT INTO `jpa`.`cst_customer ...

  10. Jenkins API用户认证方式

    1.概述 Jenkins的API可以通过用户名+密码或者用户名+Token的方式来进行认证,这篇文章以具体示例来说明具体的使用方式. 2.Jenkins环境 本文示例基于Jenkins 2.452.3 ...