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

初始化shared_ptr成员变量,new vs make_shared?

初始化shared_ptr成员变量时,可以选择使用new或者make_shared。这两种方法都可以创建一个智能指针,但它们之间存在一些差异。

  1. 使用new创建shared_ptr:
代码语言:cpp
复制
std::shared_ptr<T> ptr(new T(args));

使用new创建shared_ptr的优势在于它允许你在构造函数中传递参数。这在创建具有特定初始化参数的对象时非常有用。然而,使用new创建shared_ptr可能会导致性能问题,因为它需要两次内存分配:一次用于创建对象,另一次用于创建控制块。

  1. 使用make_shared创建shared_ptr:
代码语言:cpp
复制
std::shared_ptr<T> ptr = std::make_shared<T>(args);

使用make_shared创建shared_ptr的优势在于它只需要一次内存分配,同时它可以减少内存碎片。此外,使用make_shared创建的shared_ptr在性能上通常更优。

总结:

  • 使用new创建shared_ptr可以在构造函数中传递参数,但可能导致性能问题。
  • 使用make_shared创建shared_ptr可以减少内存碎片,并且性能更优。

推荐的腾讯云相关产品:

  • 腾讯云云服务器:提供高性能、高可用的云服务器,可以满足不同场景的计算需求。
  • 腾讯云对象存储:提供可靠的数据存储服务,可以用于存储大量的非结构化数据。
  • 腾讯云数据库:提供各种类型的数据库服务,包括关系型数据库、非关系型数据库等。

产品介绍链接地址:

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

相关·内容

【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )

static int number; }; 3、静态成员变量初始化 静态成员变量 初始化 : 静态成员变量 是在 类使用时 , 在类的外部 进行 初始化 ; Student 类的 静态成员 成员变量...初始化有两种方式 : 声明 并 进行初始化 : 声明类内部已经定义的 静态成员变量 , 然后进行初始化 ; // 在类外部初始化静态成员变量 int Student::number = 1; 只进行初始化...= " << s.number << endl; 5、静态成员变量生命周期 静态成员变量 的 生命周期 就是 程序的声明周期 ; 静态成员变量 在 应用启动时 初始化 , 在 进程结束时销毁 ; 静态成员变量在多个对象之间共享...static int number; 声明 静态成员变量 并进行初始化的代码为 int Student::number = 1; // 在类外部声明并初始化静态成员变量 int Student:...:number = 1; 单独进行 静态成员变量 初始化 , 代码为 Student::number = 2 ; // 在函数中为 类 静态成员变量 赋值 Student::number = 2;

74620

一次诡异的内存泄漏

接着,退出作用域,此时有std::make_shared创建的对象开始释放,因此其内部的成员变量r....总结 下面解释下我当时阅读这块代码最难理解的部分,下面是make_shared执行过程: •_Sp_counted_base有两个成员变量,分别为_M_use_count用于表示强引用计数和_M_weak_count...用于表示弱引用计数•__shared_count继承于_Sp_counted_base,其内部有一个变量_M_ptr指向对象指针•__shared_ptr中存在成员变量__shared_count•使用...对上述分配的内存块进行初始化(只初始化Obj大小不符,引用计数等已经初始化完成)•创建shared_ptr,因为使用的make_shared初始化,所以传入的指针为空,相应的_Sp_counted_base...中的_M_ptr也为空 下面是析构过程: •析构shared_ptr对象的同时,释放其内部成员变量_M_use_count•_M_use_count调用Release()函数,在这个函数中,如果强引用计数为

22610
  • C++ 动态内存

    静态内存: 保存局部static对象,类static数据成员和任何定义在函数之外的变量。 栈内存: 保存定义在函数内的非static对象。...当给shared_ptr赋予一个新值 2. shared_ptr被销毁,局部变量shared_ptr离开其作用域时会被销毁。 ?...除了采用make_shared创建和初始化智能指针,我们还可以用new返回的指针来初始化智能指针。 ?...我们推荐使用make_shared而不是采用new的方式,这是因为采用make_shared的方式能在分配对象的同时就讲shared_ptr与内存进行绑定,避免了无意中将同一块内存绑定到多个独立创建的shared_ptr...unique_ptr没有类似的make_shared函数,当我们定义一个unique_ptr时需要将其绑定到一个new返回的指针上,初始化unique_ptr必须采用直接初始化形式。 ?

    81320

    智能指针-使用、避坑和实现

    不能在STL容器中使用,因为复制将导致数据无效 一些STL算法也可能导致auto_ptr失效,比如std::sort算法 不能作为函数参数,因为这会导致复制,并且在调用后,导致原数据无效 如果作为类的成员变量...,都需要操作引用计数 内存占用上小于shared_ptr shared_ptr需要维护它指向的对象的线程安全引用计数和一个控制块,这使得它比unique_ptr更重量级 使用make_shared初始化...第一种初始化方法,有两次内存分配: new Type分配对象 为p1分配控制块(control block),控制块用于存放引用计数等信息 我们再看下make_shared源码: template_Getptr(), _Rx); return (_Ret); } 这里的_Ref_count_obj类包含成员变量: 控制块 一个内存块,用于存放智能指针管理的资源对象...从上面分析我们可以看出,第一种初始化方式(new方式)共有两次内存分配操作,而第二种初始化方式(make_shared)只有一次内存申请,所以建议使用make_shared方式进行初始化

    90010

    智能指针(一)

    内存使用 一般情况下有三种内存,静态内存用于保存局部static对象、类static数据成员以及函数外被定义的变量,这种对象或者变量在使用之前被分配,程序结束时销毁;栈内存用于保存在函数内的非static...new和delete new能在堆内创建一个匿名对象(该对象可以进行直接,值和列表初始化),然后返回指向该对象的指针。...new也可以配合auto来使用,自行推断对象的类型,但是初始化的参数只能有一个。...对于shared_ptr支持的常见操作而言,有以下几种: make_shared(args) //初始化 shared_ptrp(q) //q为智能指针,则拷贝指针;q指向new分配的对象...w对象的shared_ptr weak_ptr需要用shared_ptr进行初始化,但是不能用make_shard,比如: auto a = make_shared(0); weak_ptr<

    85110

    C++避坑指南

    对于作用域为多个编译单元的静态对象,不能保证其初始化次序。如下代码中,在x.cpp和y.cpp分别定义了变量x和y,并且双方互相依赖。...//x.cppextern int y;int x = y + 1; x.cpp中使用变量y来初始化x //y.cppextern int x;int y = x + 1; y.cpp中使变量x来初始化...) { Person::~Person(); throw; }} 表面上构造函数定义为空且是inline,但编译器实际会生成如右侧的伪代码来构造基类成分和成员变量...shared_ptr sp(new Object()); auto sp = make_shared();  b、减少内存管理器调用次数。...可能产生①③②的顺序,此时如果③getData()产生异常,而new Handler对象指针还没有托管到shared_ptr中,于是内存泄漏发生。使用make_shared可以避免这个问题。

    1.6K30

    智能指针在面试中得重要地位!

    ,替代手法是使用 std::make_shared,但是使用了自定义析构器,无法用std::make_shared 2,如果必须将一个裸指针传递给std::shared_ptr的构造函数,直接传递 new...运算符的结果,而非传递一个裸指针变量 */ //改进问题1: std::shared_ptr spw11(new Widget,loggingDel);//直接传递...new 表达式 std::shared_ptr spw22(spw11);//spw22使用的是和spw11同一个控制块 //问题2: //使用 裸指针变量作为 std::shared_ptr...的扩充 /** 它是通过 std::shared_ptr 来创建,当使用 std::shared_ptr完成初始化std::weak_ptr的时刻,两者就指涉到相同的位置了 但是 std::weak_ptr...和std::make_shared, 而非直接使用 new //结论:相对于直接使用 new 表达式,优先选用 make 系列函数 //C++11 std::make_shared //C++14 std

    1K20

    C++智能指针

    ---- 补充——new 一个对象加不加括号-链接 ---- 建议 1.尽可能不要将auto_ptr 变量定义为全局变量或指针,程序结束之后释放,没有意义。 2.不要定义指向智能指针的指针。...初始化对象,分配内存效率更高 make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr; (make_shared不算引用计数) 用法: make_shared...> p4 = make_shared("字符串"); 赋值 shared_ptrr up1(new int(10)); //int(10) 的引用计数为1 shared_ptr...作为被管控的对象的成员时,小心因循环引用造成无法释放资源。...---- 在必要的时候可以转换成shared_ptr .lock(); 完美解决。 类中弱指针,用shared指针构造weak指针,用的时候,将weak指针转成shared指针来调用成员函数。

    43720

    C++11:unique_ptr 自己定义类似make_shared的make_unique模板函数

    C++11中的智能指针分为共享型的shared_ptr和独占型的unique_ptr,C++11提供了make_shared函数来创建shared_ptr指针,使用起来更方便,有了make_shared...函数,就可以完全摆脱new操作了,可以写出完全没有new/delete的程序。...但是unique_ptr却不同,unique_ptr不像shared_ptr可以通过make_shared方法来创建智能指针,C++11目前还没有提供make_unique函数,在C++14中才会提供make_shared...U[size]); } 为了在创建数组时可以选择是否将数组初始化为0,函数分成执行初始化和不初始化的两个版本。...其实我是写完上面的代码在VS2015下编译时,报了个错, 我这才发现,VS2015已经提供了make_unique 以下是来自VS2015的头文件中make_unique

    1.1K20

    变量声明和初始化 var, :=, new() 和 make()

    [golang] 变量声明和初始化 var, :=, new() 和 make() 说明 go语言中,提供了多种变量声明和初始化的方法。这里着重一一说明。并提供一个简单的指南。...当使用文字方式初始化一个变量,并且需要指明类型时,使用var变量声明方式。 避免使用new(),除非你需要一个指针变量。...// 初始化一个整数指针变量,指向的值为0 var i3 *int = new(int) fmt.Println(*i3) // 初始化一个slice指针变量 var i4 = new([10...map指针变量,指向的值为[] var i5 *map[string]int = new(map[string]int) fmt.Println(*i5) // 输出: map[] // 初始化一个...chan指针变量,指向的值为nil var i6 *chan int = new(chan int) fmt.Println(*i6) // 输出: nil make() make只用于初始化 slice

    3.8K40

    Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

    初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介...: 小练习: 下面代码输出结果是 class C { C() { System.out.print("C"); } } class A { C c = new...super("B"); System.out.print("B"); } public static void main(String[] args) { new

    38830

    【规则分享】CC++成员变量初始化

    /CodeAnalysis 国内镜像:https://git.code.tencent.com/Tencent_Open_Source/CodeAnalysis 背景介绍 ▼ 在C/C++中,成员变量初始化可能会导致未定义的行为...当声明一个类或结构体时,其中的成员变量默认情况下不会被初始化。这意味着它们的值是未知的,可能是任意的。如果使用未初始化成员变量,可能会导致程序出现错误或产生不可预测的结果。...通过在声明时进行初始化,可以确保成员变量在使用之前具有已知的初始值,从而避免未定义的行为。...错误示例: 检测结构体被实例化时候,没有对成员变量进行初始化赋值的情况: #include struct MyStruct { int num; float value...; char character; MyStruct() : num(0), value(0.0f), character('\0') { // 构造函数中对成员变量进行初始化赋值

    12410

    C++(STL):03---智能指针之shared_ptr

    //指向int的listif(p1 && p1->empty())*p1="h1"; 二、make_shared函数 最安全的分配和使用动态内存的方法就是调用该函数 此函数在内存中动态分配对象并初始化,...的string shared_ptr p2=make_shared(10, '9'); //p3指向一个值初始化为0的int数 shared_ptr p3 =...因此:我们不能将一个内置指针隐式地转换为一个智能指针,必须使用直接初始化形式来初始化一个智能指针 shared_ptr p=new int(1024); //错误shared_ptr p2(new int(1024)); //正确:使用直接初始化 动态内存作为返回值时的使用手法:限于上面的使用语法,一个返回shared_ptr的函数不能在其返回语句中隐式转换为一个普通指针 shared_ptr...不支持点和箭头成员运算符访问数组,并且不提供下标运算符访问数组,只能通过get()函数来获取一个内置指针,然后再访问数组元素 shared_ptr sp(new int[3]{1,2,3},

    1.6K20

    【笔记】《C++Primer》—— 第12章:动态内存

    12.1 动态内存与智能指针 静态内存/栈内存,动态内存: 静态内存用来保存局部static对象,类static成员以及定义在函数之外的变量,使用前分配,程序结束时销毁 栈内存也属于静态内存,用来保存函数内的非...,构造的目标是默认初始化的 int* p1 = new int; // 在类型符后加小括号后,目标会自动进行值初始化,更实用 int* p2 = new...int(); // 用make_shared得到int的智能指针,此时会自动值初始化 shared_ptr p3 = make_shared();...// 也可以用内置指针来初始化智能指针,同样也可以直接用new的返回值 shared_ptr p4 = make_shared(p2); // 如果用...unique_ptr的一个特点是没有make_shared函数之类的函数可以使用,我们必须用内置指针来初始化它 // 进行内置指针的初始化初始化的动态int值为2 unique_ptr p

    47510
    领券