【C++】std::make_shared函数的详解与示例

前言

在C++中,智能指针是一种非常重要的资源管理技术,用于自动管理动态分配的内存,以防止内存泄漏。std::shared_ptr是C++标准库中的一个智能指针类型,它通过使用引用计数来确保当最后一个shared_ptr被销毁或重置时,它所指向的对象也会被自动删除。而std::make_shared则是C++11引入的一个模板函数,用于更高效地创建std::shared_ptr实例。本文将详细解析std::make_shared函数的原理,并提供相关示例。

原理特点

单一内存分配

与直接使用new操作符创建对象并通过构造函数传递给std::shared_ptr相比,std::make_shared的最大优势在于它可以在一次内存分配中同时创建对象和控制块(control block)。控制块是std::shared_ptr内部用于管理引用计数、删除器和指向对象的指针的数据结构。通过使用单一分配,std::make_shared可以减少内存碎片,提高内存使用效率,并减少内存分配的开销。

引用计数

std::shared_ptr通过维护一个引用计数来跟踪有多少个shared_ptr实例指向同一个对象。每当一个新的shared_ptr指向该对象时,引用计数增加;每当一个shared_ptr被销毁或重置时,引用计数减少。当引用计数减少到0时,shared_ptr会自动调用其关联的删除器(默认为delete)来销毁对象并释放内存。

线程安全

std::shared_ptr的引用计数操作是线程安全的,这意味着多个线程可以同时操作同一个shared_ptr对象而不会导致数据竞争。然而,对shared_ptr所指向的对象的访问仍然需要适当的同步机制,如使用std::mutex。

示例

代码

#include <iostream>
#include <vector>
#include <memory>
#include <thread>
#include <mutex>

// 定义一个包含std::vector<int>的类
class ComplexObject {
   
   
public:
    // 成员函数:向vector中添加元素
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值