std::make_shared

news/2024/10/7 11:58:26

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_ptrstd::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 是推荐的方式,除非在特定场景下需要精细控制对象的构造或内存管理。****

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/68593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

张量矩阵乘法分块乘法概述

张量矩阵乘法分块乘法概述 介绍一下矩阵计算相关的内容, 从最基本的算法,到Cutlass这些线性代数模版库, 特别是Layout代数相关的内容,再逐渐细化到一些硬件实现访存优化和一些算子融合。 6.3.1 GEMM概述 1. GEMM定义 对于一个矩阵乘法, 定义如下: (6-1)一个矩阵乘法定义,如…

Java与线程

Java与线程 1. 线程的实现 线程是比进程更轻量级的调度执行单位,线程的引人,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。 主流的操作系统都提供了线程实…

矩阵分块乘法

矩阵分块乘法 通常可以把一个矩阵分成多个块, 例如, (6-4)可以将其划分为 4个块:(6-5) (6-6)分块后的矩阵记为:(6-7) 分块矩阵乘法如下所示:(6-7)划分不一定需要完全等间隔, 只需要满足子矩阵乘法规则即可, 如图6-27所示。图6-27 子矩阵划分不一定需要完全等间…

从硬件的视角看GEMM

从硬件的视角看GEMM 1. 分块乘法的内存层次架构 分块矩阵乘法,如图6-28所示, 通过将矩阵分块拆分,能够在处理器的Cache和寄存器内存放进行快速计算,计算完成后写回主存。图6-28 分块矩阵乘法 首先,所有的数据都在主内存中,如图6-29所示。图6-29 所有的数据都在主内存中 然…

电表行业强力推荐KY8023S6对标平替BL8023双向继电器驱动芯片

双向继电器驱动芯片KY8023S6对标平替BL8023。 产品特点 SOT23-6L和SOP-8 两种封装 静态功耗电流<1uA 输入高低转换电平为1.3V(Is=1A)左右,兼容多种单片机 工作电压5-40V,推荐工作电压5-30V 输入INA和INB端自带115k下拉电阻,一般可省略外围下拉电阻 集成高速续流二极管,…

重启后,idea 依赖爆红

没改动代码,但无法运行java项目 java: -source 1.5 中不支持……表达式/运算符java: 错误: 不支持发行版本 5解决:https://www.cnblogs.com/liu-han/p/16105953.html 文件→项目结构,SDK和项目/模块 语言级别的版本要一致SDK: 1.8 项目语言级别:SDK默认值 模块语言级别:SD…

[亲测]君临九州+单机安装教程+无需虚拟机+GM后台

今天给大家带来一款单机游戏的架设:君临九州,版本号:1.0.12.30。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 1.2.题目地址 https://leetc…