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 ...
随机推荐
- 人工智能时代,前端全栈成就独立开发工程师 next.js 开发实战
next 可以服务端渲染,可以客户端渲染,让前端同事更有性价比,让我们做得可以更多 由于next.js 是基础于react 所以在正式学习next.js 之前我们了解一下react 什么叫模块 ,就 ...
- 关于visual studio的一个bug
本人初学链表,如有错误多多包涵 快马加鞭,这期只写一个问题.我好像在vs里面发现了一个bug 不管是vs2022还是vs2010都无法正常运行.关于cin.string.链表的问题 #include& ...
- STM32定时器---正交编码器模式详解
https://blog.csdn.net/wang328452854/article/details/50579832
- 【Java】MuliThread 多线程
程序Program 是完成特定人,用某种语言编写的一组指令集合,即一段静态代码,静态对象 进程Process 是程序的一次执行过程,可以是一个正在执行的程序 - 程序是静态的,进程是动态的 - 进程是 ...
- 【DataBase】XueSQL Training
地址: http://xuesql.cn/ Lesson0 -- 认识SQL -- [初体验]这是第一题,请你先将左侧的输入框里的内容清空,然后请输入下面的SQL,您将看到所有电影标题: SELECT ...
- 计算机论文中的SD SE是什么 ?
Standard Deviation (SD) and Standard Error (SE): 标准差和标准误差:在统计学和数据分析中常用来描述数据的分布和估计值的精确性.SD 表示标准差,SE 表 ...
- 程序员学习网站推荐:路线向导(roadmap.sh)
网站地址: https://roadmap.sh/ 在外网的技术论坛上看到这个网站,上面给出多种编程语言的学习路线,也就是给出不同编程语言的从易到难的组成内容(语言特性),通过这个网站可以辅助学习编程 ...
- 【转载】解决WSL中Debian显示中文乱码的问题
---------------- 版权声明:本文为CSDN博主「捕鲸叉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn. ...
- 成为Apache SeaTunnel贡献者的N种方式
如何参与开源贡献 参与开源贡献的常见方法有多种: 1)参与解答 在社区中, 帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献. 2)文档贡献 帮助框架来完善文档,比如说将英文文档翻译为中 ...
- FreeSWITCH对接http协议的tts服务
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 FreeSWITCH里面有个mod_tts_commandline模块,可以用来对接http协议的tts服务,今 ...