c++ 之shared_ptr与make_shared用法

本文介绍了程序设计中动态内存的应用场景及原因,并详细讲解了shared_ptr与make_shared的使用方法,包括它们如何帮助自动管理动态分配的内存。

  如果事先知道所需内存空间,使用静态内存是最简单的解决方案。

  但是,在程序设计的过程中,往往会遇到需要开辟一个未知大小的内存空间,该空间根据程序所需发生大小的变化,此空间称为动态内存。

  程序设计中使用动态内存的原因可能如下:

(1)程序不知道自己需要多少对象;

(2)程序不知道所需对象的准确类型;

(3)程序需要在多个对象之间共享数据

 

shared_ptr的用法:可以指向特定类型的对象,用于自动释放所指的对象。

make_shared的用法:make_shared在动态内存中分配一个对象并初始化它, 返回指向此对象的shared_ptr,与智能指针一样,make_shared定义在头文件memory中;

当要用make_shared时,必须指定想要创建的对象类型,定义方式与模板类相同,在函数名之后跟一个尖括号,在其中给出类型;

如make_shared<int>p3 = make_shared<int>(42)

一般采用auto定义一个对象来保存make_shared的结果,如auto p1 = make_shared<int>(42);

 

 

感谢https://blog.youkuaiyun.com/u013360881/article/details/71798950

智能指针的用法更多请参考C++ Reference.

 

注意智能指针是指针!指针所指向的对象有一个引用次数的属性,当引用次数为0时,该对象就会被析构。

 

转载于:https://www.cnblogs.com/jianfeifeng/p/11153646.html

### C++ 中 `std::shared_ptr` 和 `std::make_shared` 的用法及区别 #### 定义基本功能 `std::shared_ptr` 是一种智能指针,用于管理动态分配的对象。它通过引用计数机制来自动释放对象的内存[^1]。当最后一个 `std::shared_ptr` 被销毁或者重置时,所指向的对象会被删除。 `std::make_shared` 则是一个函数模板,用来创建并初始化一个由 `std::shared_ptr` 管理的对象。它的主要作用是以更高效的方式创建共享所有权的资源。 --- #### 性能差异 使用 `std::make_shared` 创建 `std::shared_ptr` 通常比直接调用 `new` 来得更加高效。这是因为 `std::make_shared` 将控制块(control block)和实际数据存储在同一块连续的内存中,减少了两次独立的内存分配操作。而手动创建 `std::shared_ptr` 需要分别分配控制块和目标对象的内存。 以下是两者的对比代码: ```cpp // 使用 new 手动创建 shared_ptr std::shared_ptr<int> ptr1(new int(42)); // 使用 make_shared 更加高效地创建 shared_ptr std::shared_ptr<int> ptr2 = std::make_shared<int>(42); ``` 上述例子展示了两种方式的区别,其中第二种方法更为推荐。 --- #### 循环依赖问题 需要注意的是,在某些情况下,如果两个或多个 `std::shared_ptr` 彼此持有对方,则可能导致循环引用问题。这种情况下,引用计数永远不会降为零,从而引发内存泄漏。为了避免这种情况的发生,可以改用 `std::weak_ptr` 来打破循环引用关系[^2]。 --- #### 编译器支持标准兼容性 不同编译器对于 C++ 标准的支持可能存在细微差别。因此,在跨平台开发过程中应特别注意确保代码具有良好的可移植性[^4]。不过就目前而言,主流现代编译器均已全面支持 `std::shared_ptr` 和 `std::make_shared` 这些基础工具的功能实现。 --- #### 示例程序 下面给出一段完整的示例代码展示如何正确运用两者: ```cpp #include <iostream> #include <memory> class MyClass { public: MyClass(int value) : data(value) {} void display() const { std::cout << "Data: " << data << '\n'; } private: int data; }; int main() { // 方法一:传统方式构建 shared_ptr auto sp1 = std::shared_ptr<MyClass>(new MyClass(10)); // 方法二:利用 make_shared 构建 shared_ptr auto sp2 = std::make_shared<MyClass>(20); sp1->display(); sp2->display(); return 0; } ``` 以上代码片段清晰表明了两种构造形式的实际应用效果以及其简洁性和效率上的优势所在。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值