当前位置:首页 » 《资源分享》 » 正文

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

28 人参与  2024年09月08日 13:23  分类 : 《资源分享》  评论

点击全文阅读


前言

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

前言原理特点单一内存分配引用计数线程安全 示例代码运行结果代码详解std::make_shared:std::shared_ptr:std::thread:std::mutex 和 std::lock_guard:线程安全:mutable关键字: 总结

原理特点

单一内存分配

与直接使用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中添加元素    void addElement(int value) {        // 使用std::lock_guard来保证线程安全        std::lock_guard<std::mutex> lock(mutex_);        elements_.push_back(value);    }    // 成员函数:显示vector中的所有元素    void displayElements() const {        // 同样使用std::lock_guard来保证在显示时不会修改vector        std::lock_guard<std::mutex> lock(mutex_);        for (int value : elements_) {            std::cout << value << " ";        }        std::cout << std::endl;    }private:    std::vector<int> elements_; // 成员变量:存储整数的vector    mutable std::mutex mutex_;  // 成员变量:用于保护elements_的互斥锁,注意是mutable的,因为它在const成员函数中被修改};// 一个简单的线程函数,用于向ComplexObject的vector中添加元素void threadFunction(std::shared_ptr<ComplexObject> obj, int value) {    obj->addElement(value);}int main() {    // 使用std::make_shared创建ComplexObject的实例    auto sharedObj = std::make_shared<ComplexObject>();    // 创建并启动两个线程,每个线程都向sharedObj的vector中添加一个元素    std::thread t1(threadFunction, sharedObj, 10);    std::thread t2(threadFunction, sharedObj, 20);    // 等待两个线程完成    t1.join();    t2.join();    // 显示vector中的所有元素    sharedObj->displayElements(); // 输出可能是10 20,但顺序可能不同,因为线程是并发执行的    // 当sharedObj离开作用域时,它指向的ComplexObject实例会被自动删除    // 由于所有对sharedObj的引用都已消失(包括在t1和t2中的那些,它们已经join()),    // 所以引用计数会减到0,ComplexObject的析构函数会被调用    return 0;}

运行结果

在这里插入图片描述

代码详解

std::make_shared:

用于创建std::shared_ptr的实例,并自动管理其指向的对象的生命周期。
在一次内存分配中同时创建对象和控制块,减少内存碎片和分配开销。

std::shared_ptr:

智能指针,通过引用计数来管理动态分配的内存。
当最后一个std::shared_ptr被销毁或重置时,它所指向的对象也会被自动删除。

std::thread:

用于表示一个执行线程的对象。
可以通过传递函数和参数给线程构造函数来启动一个新线程。

std::mutex 和 std::lock_guard:

std::mutex是一个互斥锁,用于保护共享数据免受多个线程的并发访问。
std::lock_guard是一个RAII(Resource Acquisition Is Initialization)风格的锁管理类,它在构造时自动加锁,在析构时自动解锁,从而简化锁的管理。

线程安全:

在多线程程序中,对共享数据的访问必须是线程安全的。
在本例中,我们使用std::mutex和std::lock_guard来保护ComplexObject中的elements_成员,以防止在并发修改时发生数据竞争。

mutable关键字:

允许在const成员函数中修改成员变量。

在本例中,mutex_被声明为mutable,因为它在const成员函数displayElements中被修改(即加锁和解锁)。注意,这并不意味着elements_本身在const成员函数中被修改;mutex_的修改是

总结

std::make_shared是C++11提供的一种高效、安全的智能指针工厂函数。通过在一次内存分配中同时创建对象和控制块,std::make_shared可以减少内存分配的开销,提高内存使用效率。同时,std::shared_ptr的引用计数机制确保了当最后一个shared_ptr被销毁时,所指向的对象也会被自动删除,从而有效防止内存泄漏。然而,需要注意的是,虽然std::shared_ptr的引用计数操作是线程安全的,但对所指向对象的访问仍然需要适当的同步机制。


点击全文阅读


本文链接:http://zhangshiyu.com/post/157020.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 万物复苏,末世来临热门小说苏愉薛遇(万物复苏,末世来临热门小说)全文免费阅读无弹窗大结局_(苏愉薛遇免费阅读全文大结局)最新章节列表_笔趣阁(苏愉薛遇) -
  • 军婚撩人:八零娇妻火辣辣最新热门小说冯晚禾薛战城全文免费阅读无弹窗大结局_(冯晚禾薛战城)冯晚禾薛战城最新章节列表笔趣阁(军婚撩人:八零娇妻火辣辣最新热门小说) -
  • 顾凡任盈盈《快穿之扫地僧在武林杀疯了全集》全文免费阅读无弹窗大结局_(顾凡任盈盈)最新章节免费在线阅读 -
  • 快穿之扫地僧在武林杀疯了完结版(顾凡任盈盈)全文免费阅读无弹窗大结局_(快穿之扫地僧在武林杀疯了完结版小说免费阅读)最新章节列表_笔趣阁(快穿之扫地僧在武林杀疯了完结版) -
  • 免费完结版小说回家过年,我把侄子送进了少管所_回家过年,我把侄子送进了少管所(林晓孟倩林浩)免费小说全本_全本免费完结小说回家过年,我把侄子送进了少管所
  • 书荒宝藏文《简星星江桁》简星星江桁(小说全文阅读无弹窗)全文免费阅读
  • 《江雨柔苏宸》已完结(江雨柔苏宸)热门小说完整版)全文阅读笔趣阁
  • 回家过年,我把侄子送进了少管所(林晓孟倩林浩)阅读免费小说_全本免费小说阅读回家过年,我把侄子送进了少管所(林晓孟倩林浩)最新更新
  • 最新免费小说除夕夜大伯心梗,我替婆婆送花圈油爱芳瑶瑶_除夕夜大伯心梗,我替婆婆送花圈(油爱芳瑶瑶)热门小说推荐
  • 搬空钱财:下乡的娇知青她军婚了全集姜温婉周云霆(搬空钱财:下乡的娇知青她军婚了全集)全文免费阅读无弹窗大结局_(姜温婉周云霆免费阅读全文大结局)最新章节列表_笔趣阁(姜温婉周云霆) -
  • 情深几许再难圆热门小说免费(陈墨燃沈心宁)全文免费阅读无弹窗大结局_(情深几许再难圆热门小说小说免费阅读)最新章节列表_笔趣阁(情深几许再难圆热门小说) -
  • 伽蓝如梦情如尘完结版阅读(林清规梵清)全文免费阅读无弹窗大结局_(伽蓝如梦情如尘完结版阅读)林清规梵清最新章节列表_笔趣阁(伽蓝如梦情如尘完结版阅读) -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1