首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

采用2d阵列的c++ make_shared<>

std::make_shared 是 C++11 引入的一个函数模板,用于创建 std::shared_ptr 智能指针。它简化了 std::shared_ptr 的创建过程,并且通常比直接使用 std::shared_ptr 构造函数更高效,因为它一次分配内存就可以同时存储对象和控制块。

基础概念

  • 智能指针:是一种对象,它模拟了指针的行为,但提供了额外的功能,如自动内存管理。
  • std::shared_ptr:是一种智能指针,允许多个 shared_ptr 实例共享同一个对象的所有权。当最后一个拥有该对象的 shared_ptr 被销毁时,对象会被自动删除。
  • std::make_shared:是一个工厂函数,用于创建 std::shared_ptr 实例。它内部进行了优化,通常只进行一次内存分配。

优势

  1. 性能优化std::make_shared 通常比直接使用 std::shared_ptr 构造函数更高效,因为它可以一次性分配足够的内存来存储对象和控制块。
  2. 异常安全:使用 std::make_shared 可以更容易地编写异常安全的代码,因为它减少了显式使用 new 的需要。
  3. 简洁性std::make_shared 提供了一种简洁的方式来创建 std::shared_ptr

类型

std::make_shared 是一个模板函数,可以用于任何可以通过 new 创建的对象类型。

应用场景

  • 当你需要创建一个 std::shared_ptr 并且想要优化性能时。
  • 当你需要编写异常安全的代码时。
  • 当你想要避免显式使用 newdelete 时。

示例代码

代码语言:txt
复制
#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass(int value) : data(value) {}
    void print() const { std::cout << "Data: " << data << std::endl; }
private:
    int data;
};

int main() {
    // 使用 std::make_shared 创建一个 MyClass 的 shared_ptr
    auto ptr = std::make_shared<MyClass>(42);

    // 使用 shared_ptr
    ptr->print();

    return 0;
}

遇到的问题及解决方法

问题:为什么有时候 std::make_shared 比直接使用 std::shared_ptr 构造函数慢?

这通常不是 std::make_shared 的问题,而是由于以下原因:

  1. 内存分配器:如果自定义了内存分配器,并且这个分配器的性能不如默认的,那么可能会看到性能下降。
  2. 对象大小:如果对象非常大,那么即使 std::make_shared 进行了一次内存分配,这个分配也可能比多次小分配要慢。

解决方法:

  • 使用默认分配器:除非有充分的理由,否则使用默认的内存分配器。
  • 分析对象大小:如果对象非常大,考虑是否可以将其分割成更小的部分,或者使用其他类型的智能指针,如 std::unique_ptr

注意事项

  • std::make_shared 不支持自定义删除器,因为它需要在创建时知道控制块的大小。
  • 如果需要自定义删除器,应该直接使用 std::shared_ptr 构造函数。

以上就是关于 std::make_shared 的基础概念、优势、类型、应用场景以及可能遇到的问题和解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

单链表的C++实现(采用模板类)

采用模板类实现的好处是,不用拘泥于特定的数据类型。就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作。   ...本文采用的是第4种结构类型 /************************************************************************* 1、复合类:在Node类中定义友元的方式...,返回第一个找到的满足该数值的结点指针     LinkNode* Find(T &item); //定位指定的位置,返回该位置上的结点指针     LinkNode* Locate(int...图:单链表插入操作 要在p结点后插入一个新结点node,(1)要让node的next指针指向p的next结点;(2)再让p的next指向node结点(即断开图中的黑色实线,改成红色虚线指向node) 接下来...结点的下一个结点;再让curr结点的next指针指向prev。

2.5K70
  • C++项目中采用CLR的方式调用C#编写的dll

    1、注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误。...2、将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下 3、将C++项目属性设置为公共语言运行时支持 4、在项目中导入dll文件和引用命名空间 #using "...../debug/xxx.dll" using namespace xxxx; 5、实例化C#对象:CL ^cl = gcnew CL(); 6、调用C#带out string[] 参数的方法:intPowerOff...String^>(0); int result = cl->PowerOff(FrameAry); printf("上行报文:%s", FrameAry[0]); 7、调用带int类型和string类型的方法...int r = cl->InitSetting(1, 3000, 200, "193.168.18.11", 10004, 20000); 8、调用带int[] 、Single[]类型参数的方法:boolSetHarmonic

    2.3K30

    【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

    C 样式编程的一个主要 bug 类型是内存泄漏。 泄漏通常是由于为分配的内存的调用失败引起的 delete new。 现代 C++ 强调“资源获取即初始化”(RAII) 原则。 其理念很简单。...--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...(argument); 使用make_shared作为创建对象的简单、更高效的方法,以及一个shared_ptr来同时管理对对象的共享访问。...使用make_shared的语句更简单,因为只涉及到一个函数调用。 这样会更有效,因为库可能会对对象和智能指针进行一个分配。...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。

    1.1K20

    C++ 动态内存

    在c++的内存上我碰到很多很多坑~,特此来记一笔。...局部的static对象只在第一次使用前进行分配,在程序结束时销毁。 但是除了自动和static对象之外,C++还支持动态分配对象。...尤其是使用智能指针能够在动态对象不再使用时释放动态对象的特性,使得内存的使用变得非常容易。 除了采用make_shared创建和初始化智能指针,我们还可以用new返回的指针来初始化智能指针。 ?...我们推荐使用make_shared而不是采用new的方式,这是因为采用make_shared的方式能在分配对象的同时就讲shared_ptr与内存进行绑定,避免了无意中将同一块内存绑定到多个独立创建的shared_ptr...unique_ptr没有类似的make_shared函数,当我们定义一个unique_ptr时需要将其绑定到一个new返回的指针上,初始化unique_ptr必须采用直接初始化形式。 ?

    82220

    Effective C++条款13 C++基本功之智能指针

    在旧式的C++程序开发过程中,我们会比较习惯用传统的裸指针来管理资源,通过成对使用new和delete来保证内存安全,这种做法不会造成太大问题,只是在某些情况下会出现内存难于管理的局面。...if(...){ return; } ... } 这样采用对象的方式来管理内存,通过对象的生命周期来自动释放内存。...std::make_shared 能够用来消除显式的使用 new, 并返回这个对象类型的std::shared_ptr指针。...对于前一个问题,C++标准库声明shared_ptr是线程安全的,不用担心引用次数出问题,也不用担心析构函数会调用多次。...总结 智能指针这种技术并不新奇,在很多语言中都是一种常见的技术,现代 C++ 将这项技术引进,在一定程度上消除了 new/delete 的滥用,是一种更加成熟的编程范式。

    80841

    AI智能分析开发中采用c++中文编码出现乱码是什么导致的?

    EasyCVR的AI智能分析版本在做研发的时候,就受到了很多朋友的关注,EasyCVR的人脸识别功能采用了Go语言,使用c/c++ 的头文件和dll文件。...在C++ 中如果出现中文,会出现乱码的问题,使用notepad++打开保存的二进制文件,出现乱码。...image.png 正常的情况选择UTF8编码正常显示: image.png 在计算机的内部,所有的数据都是以二进制的形式保存的,在存储文本时,需要将文本文件的信息都转换为二进制进行保存,而现实是将二进制转换为文本显示...ASNI:除了中国以外,其他的许多国家页都制定自己的编码标准。 Unicode:由于不同的ANSI编码之间互不兼容,这样进行信息交互就会进行编码转换。...UTF-8:Unicode可以表示所有的字符,但是英文字符也与其他字符一样,使用两个字节进行编码,使得在保存英文文本的时候会多出一倍的存储空间,而大多数的文本信息都是英文的。

    1.6K20

    让你的代码更CPP一点(前缀树示例)

    不知道各位写C++代码的童鞋们,有没有发现一个现象,自己写的CPP代码怎么那么像C代码呢?...笔者也深有感触,但是自从C++11标准出现以后,CPP的代码就开始精简很多了,风格也极大的发生了变化,今天笔者就开始整理一些C++的新特性,并展示如何在实际应用中使用!让你的代码更Cpp些!...5.智能指针(shared_ptr和make_shared) 我在刷题的时候,由于是参考了JAVA版的,在JAVA中可以靠JVM的垃圾回收机制,特别是考虑到大数据问题,在栈区建立一个链表或者树结构可能会导致空间不够...最后的weak_ptr为一个弱引用,指向shared_ptr所管理的对象! shared_ptr采用引用计数的方式管理所指向的对象。...但一般不建议使用new方法对智能指针初始化,这样会造成阅读代码的困惑!建议使用make_shared函数进行初始化!当然为了代码简洁,我们可以使用auto类型进行类型推倒!

    64620

    什么是智能指针

    例如 TCP 连接中我封装一个 accept 函数接收请求,那么应该是这样的: Socket accept(); 这就带来一个问题,采用对象作返回值,这里面有一个对象复制的过程。...还有一个例子,Java 中往容器中放对象,实际放入的是引用,不是真正的对象,而 C++ 在 vector 中 push_back 采用的是值拷贝。...这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。 建立所有权(ownership)概念。...这是 shared_ptr 采用的策略。 你会发现,使用 auto_ptr 所隐藏的的弊处可能远比它带来的利要多,这就是为何要摒弃 auto_ptr 的原因。...也因此 C++ 11 发布了新式的三种智能指针用以取代和扩展更丰富的功能。

    63520

    C++智能指针weak_ptr

    C++智能指针weak_ptr 学习路线:C++智能指针shared_ptr->C++智能指针unique_ptr->C++智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,包括...概述 weak_ptr设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少...(); auto p2 = make_shared(); p1->school = p2; p2->school = p1; return...0; } 运行结果: 环形依赖问题导致,shared_ptr的引用计数不能降为0的问题,两个对象函数之间相互引用导致,引用计数不能降为0,然后就无法释放创建的两个对象,所以下面的输出就是没有输出。...(); auto p2 = make_shared(); p1->school = p2; p2->school = p1; return

    6800

    ROS2机器人编程简述humble-第四章-The TF Subsystem

    这个是ROS2机器人的核心工具之一。 概念: TF(坐标系转换)子系统是ROS2机器人框架中的一个重要组件,它的功能是提供坐标系转换服务,使得不同坐标系之间的数据可以转换。...比如,机器人的传感器可以产生的数据是基于机器人本体坐标系的,而机器人的末端机械臂可以根据这些数据来控制机械臂的运动,但是机械臂需要的数据是基于机械臂坐标系的,这时候TF子系统就可以把数据从机器人本体坐标系转换成机械臂坐标系...,从而实现机械臂的控制。...C++案例: #include #include #include #include "geometry_msgs/msg/transform_stamped.hpp...t.header.frame_id = "world"; t.child_frame_id = turtlename_.c_str(); // Turtle only exists in 2D

    67010

    智能指针

    2.3 如何检测内存泄漏(了解) 在linux下内存泄漏检测:Linux下几款C++程序中的内存泄露检查工具_c++内存泄露工具分析-CSDN博客 在windows下使用第三方工具:VS编程内存泄漏:VLD...采用RAII思想或者智能指针来管理资源。 3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。 4. 出问题了使用内存泄漏工具检测。...采用这种方式,对象所需的资源在其生命期内始终保持有效。...以下是 make_shared 的一些关键点: 功能 make_shared 用于创建一个 std::shared_ptr 对象,该对象管理动态分配的对象。...make_shared 是 C++ 中管理动态内存时非常有用的工具,可以减少代码量并提高性能。然而,了解其使用限制和最佳实践是编写高效、安全代码的关键。

    8010

    Nubis公司的1.6T光引擎

    传统的CPO方案中,ASIC芯片位于基板中央,而光引擎分布在基板的四条片上,典型的结构如下左图所示,由于PIC通过采用edge coupler进行耦合,光纤阵列从CPO的一侧对外输出光信号。...而Nubis公司的方案是采用2D光纤阵列进行表面耦合,提高了带宽密度。此外,由于光纤从芯片表面输出,光引擎可以以二维阵列的形式分布在基板上,而不局限在四条边上,如下右图所示。...光引擎实物图如下图所示,硅光芯片的尺寸为7mm*5.5mm, 内部包含16通道Tx与Rx,单通道信号速率为112Gbps,共包含36个光口,有4个光口用于激光器输入,光纤阵列每行有12个光口。...封装好后的光引擎尺寸为15mm*15mm*3mm。光引擎可以通过2D阵列分布的形式,进一步提高带宽密度,将带宽密度进一步提升到0.75Tbps/mm。关于其硅光芯片的fab,目前还无法得知。...其核心技术包括硅光芯片与模拟芯片的联合设计,从整体上优化整个系统,将功耗降低到5pJ/bit以下,而特有的2D光纤阵列使得其带宽密度优于传统光模块。目前其1.6T光引擎已处于送样阶段。

    87110

    【Example】C++ 接口(抽象类)概念讲解及例子演示

    C++ 和 Java 不同的是,C++ 没有 interface 关键字。对于很多新手来说,C++ 当中接口的概念不容易像 Java 当中那样被理解。...然而接口是面向对象编程当中的重要组成部分,也是新手需要学习的重要思维,虽然 C++ 并不那么面向对象。...那么,C++ 当中既然不存在 interface 关键字,那么接口是通过什么方式来实现的呢?...这里的 Demo 不像高校老师那样随便写几个类来演示了,而是选择一个更贴合实际开发的场景: 定义一个接口(抽象类),封装两个动态库代码去继承并分别采用不同方式实现,最后在 main 函数中执行通过多态获得不同效果...(); shared_ptr hr = make_shared(); cr-

    1.8K20

    C++避坑指南

    C++跟《九阴真经》一样,如果使用不当,很容易落得跟周芷若、欧阳锋、梅超风等一样走火入魔。这篇文章总结了在学习C++过程中容易走火入魔的一些知识点。...可以采用代码中的几种方法定义一个对象。...//违反标准c++容器复制语义ptrList.push_back(ap2);ptrList.push_back(ap3); 6.2 std::shared_ptr std::shared_ptr采用引用计数共享指针指向对象所有权的智能指针...如果make_shared先调用,在getData被调用前动态分配的Hander对象已经被安全的存储在返回的shared_ptr对象中,接着即使getData产生了异常shared_ptr析构函数也能正常释放...如果getData先调用并产生了异常,make_shared则不会被调用。 但是make_shared并不是万能的,如不能指定自定义删除器,此时可以先创建shared_ptr对象再传递到函数中。

    1.6K30
    领券