shared_ptr使用总结

make_shared返回值

看到不少人的代码中在使用 std::make_shared的时候,对于返回值进行了空指针判定,这是没有必要的。

首先关于malloc的返回值是这么说的:

成功时,返回指向新分配内存起始的指针。返回的指针必须用 std::free() 或 std::realloc() 解分配。

失败时,返回空指针

而对于make_shared是这样的。

类型 T 实例的 std::shared_ptr 。

异常

可能抛出 std::bad_alloc 或任何 T 构造函数所抛的异常。若抛出异常,则函数无效果。

为什么使用make_shared

此函数可用作 std::shared_ptr<T>(new T(args...)) 的替代品。得失是:

  • std::shared_ptr<T>(new T(args...)) 进行至少二次分配(一次为 T 而另一次为共享指针的控制块),而 std::make_shared<T> 典型地仅进行一次分配(标准推荐但不要求如此,所有已知实现均如此)。
  • 若任何 std::weak_ptr 在所有共享拥有者的生存期结束后引用 std::make_shared 所创建的控制块,则 T 所占有的内存维持着,直至所有弱拥有者亦被销毁,若 sizeof(T) 较大则这可能是不想要的。
  • std::shared_ptr<T>(new T(args...)) 可能调用 T 的非公开构造函数,若在它可访问的语境中执行,而 std::make_shared 要求对被选择构造函数的公开访问。
  • 不同于 std::shared_ptr 构造函数, std::make_shared 不允许自定义删除器。
  • std::make_shared 使用 ::new ,故若用类特定的 operator new 设置了任何特殊行为,则它将异于 std::shared_ptr<T>(new T(args...)) 。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shared_ptr是C++11中提供的智能指针类之一,用于管理动态分配的内存。它具有和普通指针一样的访问数据的方法,比如通过解引用操作符*来访问指针指向的对象,通过箭头操作符->来访问指针指向对象的成员。例如,我们可以通过以下方式创建一个shared_ptr指向double类型的对象,并访问该对象的值: ``` std::shared_ptr<double> p(new double(2.0)); double value = *p; ``` 在这个例子中,我们使用new操作符动态分配了一个double类型的对象,并将其作为参数传递给shared_ptr的构造函数。通过解引用操作符*,我们可以获取指针指向的对象的值。 此外,shared_ptr还提供了其他有用的功能,比如自动释放内存和避免内存泄漏。当最后一个指向某个对象的shared_ptr销毁时,它会自动释放内存。这意味着无需手动调用delete来释放对象的内存,从而减少了内存泄漏的可能性。 总结来说,shared_ptr是一种可以自动管理动态分配内存的智能指针,它具有和普通指针一样的访问数据的方法,并提供了自动释放内存和避免内存泄漏的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++学习 一、shared_ptr使用](https://blog.csdn.net/qq_41035283/article/details/122502906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值