首页 > 其他分享 >std::make_shared

std::make_shared

时间:2024-10-07 11:49:31浏览次数:11  
标签:std make 内存 new shared ptr

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,内存,new,shared,ptr
From: https://www.cnblogs.com/niumachen/p/18449877

相关文章

  • `std::packaged_task`、`std::thread` 和 `std::async` 的区别与联系
    std::packaged_task、std::thread和std::async的区别与联系std::packaged_task、std::thread和std::async都是C++11中提供的并发工具,用于执行任务并处理多线程操作。虽然它们都有类似的作用(并发执行任务),但在功能和使用方式上有显著区别。下面分别解释它们的特点,并说明它......
  • std::unique_lock
    std::unique_lock是C++11标准库中的一个类,提供了一种灵活的方式来管理互斥量(mutex)。它比std::lock_guard更加灵活,允许在不同的作用域和不同的锁定策略之间进行选择。以下是对unique_lock的详细解释,包括其用途、使用方法和优点。1.定义std::unique_lock是一种RAII(资......
  • stdio流缓冲区
    文件流缓冲区每个进程都各自维护一个文件流表,和文件描述符表类似,并且这些文件流都有自己对应的缓冲区缓冲区的设计就是为了减少磁盘io,加快io的速度缓冲区模式通过setvbuf或者setbuf两个函数设置缓冲区的模式无缓冲区就是禁用缓冲区的意思,这种模式下,就相当于直接调用write函......
  • 题解:SP1703 ACMAKER - ACM (ACronymMaker)
    题目大意:一个有一些单词组成的短语,给定一个缩写词,求此缩写由此短语的单词组成的可能方案数。注意,短语中所有重要的单词都要用到,顺序必须和缩写词单词顺序一致。思路动态规划设置:\(dp_{i,j}\):使用前\(i\)个重要单词形成前\(j\)个缩写字符的方法数。\(dp2_{k,m}\):辅助数组......
  • VScode Cmake-tools 部分问题记录
    我的VisualStudioCode先前一直安装了cpp-tools和cmake-tools。随后,我升级了我的GCC环境版本。然而,重新启动VisualStudioCode后,旧的GCC版本仍保留在工具包中。起初,我以为是cpp-tools插件的问题,一直无法解决这个bug。后来卸载了相关插件后才发现是cmake-tools的......
  • WPF Calendar DisplayMode SelectionMode FirstDayOfWeek Start End BlackoutDates
    //xaml<Windowx:Class="WpfApp427.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • llama-factory挂载pm2出现问题:node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9'
    使用ssh连接服务器上运行llama-factory进行微调,但是一旦关闭ssh,程序也会随之关闭,而使用nohup命令会出现nohup:ignoringinput尝试采用pm2:(base)[hongjiayin@localhostLLaMA-Factory]$pm2startstart.shnode:/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound......
  • CMake构建学习笔记18-cpp-httplib库的构建
    cpp-httplib库是笔者认为的一个比较好用的基于C++的Http服务器组件,与Eigen一样,它也是基于头文件的库,我们只需要引入httplib.h这个头文件进行来就实现所有基于http/https协议的功能,非常适合初学者进行使用。尽管是头文件,还是可以使用CMake进行构建,便于统一管理,关键脚本如下:#配置......
  • C++ 智能指针详解: std::unique_ptr 和 std::shared_ptr
    C++11引入了智能指针,它们是管理动态分配内存的强大工具。本文将详细介绍两种最常用的智能指针:std::unique_ptr和std::shared_ptr。std::unique_ptr概述std::unique_ptr是一种独占所有权的智能指针。它确保一个对象只能被一个unique_ptr所拥有,这意味着不能复制unique_......
  • C++17 std::variant 详解:概念、用法和实现细节
    std::variant是C++17引入的一个新的标准库类型,它提供了一种类型安全的联合体。这个类可以在同一时间持有几种可能类型中的一个值。本文将详细介绍std::variant的概念、用法和实现细节。1.基本概念std::variant是一个模板类,可以存储几种不同类型中的一个值。它的声明如下:te......