<C++学习> C++ Boost 内存管理教程

C++ Boost 内存管理教程

Boost 提供了一系列工具来增强 C++ 的内存管理能力,主要通过智能指针、池分配器和内存池等模块实现。与原始指针和手动内存分配相比,Boost 内存管理工具能够显著提升安全性和性能,同时简化开发。


1. 内存管理的核心工具

Boost 中与内存管理相关的主要模块包括:

  1. Boost.SmartPtr(智能指针):
    • 提供内存生命周期管理,包括 boost::shared_ptrboost::weak_ptrboost::scoped_ptrboost::intrusive_ptr
  2. Boost.Pool(内存池):
    • 提供高效的内存分配和释放机制。
  3. Boost.Interprocess(共享内存管理):
    • 提供多进程共享内存的管理功能。
  4. Boost.Allocator(分配器):
    • 提供定制的分配器以优化内存分配。

2. Boost.SmartPtr(智能指针)

2.1 boost::shared_ptr

  • 功能:共享所有权的智能指针,基于引用计数管理内存。
  • 应用场景:当多个对象需要共享同一块内存时。
示例:基本使用
#include <boost/shared_ptr.hpp>
#include <iostream>int main() {boost::shared_ptr<int> sp1(new int(42));boost::shared_ptr<int> sp2 = sp1; // 共享所有权std::cout << "Value: " << *sp1 << ", Use count: " << sp1.use_count() << std::endl;sp1.reset(); // 释放 sp1 的所有权std::cout << "After reset, Use count: " << sp2.use_count() << std::endl;return 0;
}
输出
Value: 42, Use count: 2
After reset, Use count: 1

2.2 boost::weak_ptr

  • 功能:提供非所有权的指针访问,解决循环引用问题。
  • 应用场景:与 boost::shared_ptr 配合,避免循环引用。
示例:解决循环引用
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <iostream>struct Node {boost::shared_ptr<Node> child;~Node() { std::cout << "Node destroyed" << std::endl; }
};int main() {boost::shared_ptr<Node> parent(new Node());boost::shared_ptr<Node> child(new Node());parent->child = child;child->child = parent; // 循环引用导致内存泄漏return 0;
}

通过 boost::weak_ptr 解决:

#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <iostream>struct Node {boost::weak_ptr<Node> parent; // 使用 weak_ptr 打破循环~Node() { std::cout << "Node destroyed" << std::endl; }
};int main() {boost::shared_ptr<Node> node1(new Node());boost::shared_ptr<Node> node2(new Node());node1->parent = node2;node2->parent = node1;return 0; // 正常释放内存
}

2.3 boost::intrusive_ptr

  • 功能:用户手动管理引用计数,性能优于 boost::shared_ptr
  • 应用场景:性能关键场景。
示例:自定义引用计数
#include <boost/intrusive_ptr.hpp>
#include <iostream>class MyClass {int ref_count = 0;friend void intrusive_ptr_add_ref(MyClass* p) {++p->ref_count;}friend void intrusive_ptr_release(MyClass* p) {if (--p->ref_count == 0) {delete p;}}public:void display() const { std::cout << "MyClass instance!" << std::endl; }
};int main() {boost::intrusive_ptr<MyClass> ptr1(new MyClass());boost::intrusive_ptr<MyClass> ptr2 = ptr1; // 引用计数增加ptr1->display();ptr2.reset(); // 引用计数减少ptr1.reset(); // 对象被销毁return 0;
}

3. Boost.Pool(内存池)

Boost.Pool 提供了一种高效的内存分配机制,通过预分配和复用内存块,减少动态内存分配的开销。

3.1 boost::pool

  • 功能:为固定大小的对象提供内存池。
  • 应用场景:频繁分配和释放固定大小对象的场景。
示例:内存池分配
#include <boost/pool/pool.hpp>
#include <iostream>int main() {boost::pool<> memory_pool(sizeof(int)); // 为 int 类型分配内存池int* p1 = static_cast<int*>(memory_pool.malloc()); // 分配内存int* p2 = static_cast<int*>(memory_pool.malloc());*p1 = 42;*p2 = 100;std::cout << "p1: " << *p1 << ", p2: " << *p2 << std::endl;memory_pool.free(p1); // 释放内存memory_pool.free(p2);return 0;
}

3.2 boost::object_pool

  • 功能:支持对象的内存分配和构造。
  • 应用场景:需要快速分配和释放对象。
示例:对象池分配
#include <boost/pool/object_pool.hpp>
#include <iostream>struct MyClass {int value;MyClass(int v) : value(v) { std::cout << "Constructed: " << value << std::endl; }~MyClass() { std::cout << "Destructed: " << value << std::endl; }
};int main() {boost::object_pool<MyClass> obj_pool;MyClass* obj1 = obj_pool.construct(42); // 使用对象池创建对象MyClass* obj2 = obj_pool.construct(100);std::cout << "obj1 value: " << obj1->value << ", obj2 value: " << obj2->value << std::endl;// 不需要手动销毁,对象池自动管理内存return 0;
}

4. Boost.Interprocess(共享内存)

boost::interprocess 提供了多进程共享内存的管理功能。

示例:共享内存分配

#include <boost/interprocess/managed_shared_memory.hpp>
#include <iostream>namespace bip = boost::interprocess;int main() {// 创建共享内存段bip::managed_shared_memory shared_mem(bip::create_only, "SharedMemory", 1024);// 在共享内存中分配一个整数int* shared_int = shared_mem.construct<int>("MyInt")(42);std::cout << "Shared integer: " << *shared_int << std::endl;// 销毁共享内存中的对象shared_mem.destroy<int>("MyInt");return 0;
}

5. Boost.Allocator(分配器)

Boost 提供了自定义分配器,可以优化容器的内存分配。


6. 学习建议

  1. 掌握智能指针的基础用法

    • 学习 boost::shared_ptrboost::weak_ptr
    • 理解 boost::intrusive_ptr 的高级用法。
  2. 尝试使用内存池优化性能

    • 在性能关键场景中尝试 boost::poolboost::object_pool
  3. 了解共享内存

    • 在多进程场景中尝试 boost::interprocess 的功能。
  4. 参考文档

    • Boost.SmartPtr 官方文档
    • Boost.Pool 官方文档
    • Boost.Interprocess 官方文档

通过实践这些工具,Boost 的内存管理模块可以帮助你编写更高效、更安全的 C++ 程序!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员如何高效学习API

API&#xff08;应用程序编程接口&#xff09;是软件开发中的关键组件&#xff0c;它允许不同的软件应用程序相互通信、交换数据和功能。作为程序员&#xff0c;掌握API的学习和应用是提升开发效率和代码质量的重要途径。本文将详细介绍程序员如何高效学习API&#xff0c;包括基…

如何播放视频文件

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节3. 示例代码4. 内容总结我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用的功能,不过Flutter官方…

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法

目录 1.小区间优化 测试代码 运行结果 2.非递归的解决方法(重要!) 递归产生的问题 一般来说,递归改非递归有两种方法 算法分析 递归产生的二叉树 栈的示意图 先写代码框架 再填写细节部分 1.小区间优化 回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…

Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓

查找、绘制轮廓、圆形矩形轮廓和近似轮廓 目录 查找、绘制轮廓、圆形矩形轮廓和近似轮廓1 轮廓查找和绘制1.1 轮廓查找1.1.1 函数和参数1.1.2 返回值 1.2 轮廓绘制1.2.1 函数和参数 1.3 步骤1.4 实际测试绘制轮廓 2 绘制近似轮廓2.1 函数和参数2.2 查找特定轮廓2.3 近似轮廓测试…

【Linux】模拟Shell命令行解释器

一、知识补充 1.1 snprintf snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, con…

云计算基础,虚拟化原理

文章目录 一、虚拟化1.1 什么是虚拟化1.2 虚拟化类型 二 、存储虚拟化2.1 存储指标2.2 存储类型2.3 存储协议2.4 RAID 三、内存 i/O虚拟化3.1 内存虚拟化基本概念地址空间转换原理内存共享与隔离原理 3.2 I/O 虚拟化基本概念模拟&#xff08;Emulation&#xff09;方式半虚拟化…

Vue3 + Vite + Electron + Ts 项目快速创建

一、创建 Vue 项目 1. 创建项目 pnpm create vite 2. 安装依赖 cd excel-electron pnpm install 3. 运行项目 pnpm dev 二、添加 Electron 1. 安装 electron pnpm add electron -D 2. 修改 package.json 添加入口 js 和执行命令。 {"main": "dist-ele…

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 &#xff1f;一文详解allure的使用 。_allure测试报告-CSDN博客 例子&#xff1a; import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

新活动平台建设历程与架构演进

01 前言 历时近两年的重新设计和迭代重构&#xff0c;用户技术中心的新活动平台建设bilibili活动中台终于落地完成&#xff01;并迎来了里程碑时刻 —— 接过新老迭代的历史交接棒&#xff0c;从内到外、从开发到搭建实现全面升级&#xff0c;开启了活动生产工业化新时代&#…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

MR实战:IP地址去重

文章目录 1. 实战概述2. 提出任务2.1 原始问题2.2 简单化处理 3. 准备数据3.1 在云主机上创建文本文件3.2 上传文件到HDFS指定目录 4. 实现步骤4.1 创建Maven项目4.2 添加相关依赖4.3 创建日志属性文件4.4 创建网址去重映射器类4.5 创建网址去重归并器类4.6 创建网址去重驱动器…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法

目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html 通过js代码 标签属性等手段进行一个过滤 不允许出现css的payload 前端过滤 我可以在抓包工具里面修改 抓包工具是不受前端的防御 也 就是浏览器 服务端过滤…

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…