C++ 内存管理库 memory 功能 用法运用 详解

news/2025/3/10 11:32:46/文章来源:https://www.cnblogs.com/baisemoshui/p/18762284

C++中的<memory>头文件是处理动态内存管理的重要部分,它提供了多种工具来帮助开发者更安全、更有效地管理内存,避免常见的内存管理错误。以下是对<memory>头文件的功能、用法及运用的详细解析:

一、功能

<memory>头文件主要包含以下内容:

  1. 智能指针:用于自动管理动态分配的内存,避免内存泄漏和悬空指针问题。包括std::unique_ptrstd::shared_ptrstd::weak_ptr等。
  2. 分配器:用于为容器分配内存,所有标准库容器都使用分配器来处理内存分配。std::allocator是标准分配器,提供了基本的内存分配和释放功能。
  3. 其他内存管理工具:如std::align用于调整指针的对齐方式,std::addressof用于获取对象的实际地址等。

二、智能指针详解及用法

  1. std::unique_ptr

    • 功能:独占所有权的智能指针,确保在同一时间只有一个std::unique_ptr可以拥有对象的所有权。当std::unique_ptr被销毁或重置时,它所拥有的对象会被自动删除。
    • 用法
      • reset():释放当前拥有的对象,并可接收一个新的指针,将所有权转移给新指针。
      • release():放弃对当前对象的所有权,并返回原始指针。使用时需谨慎,因为返回的指针需要手动管理。
      • get():返回存储的裸指针,在需要将智能指针传递给不支持智能指针的旧API时使用,但要注意避免在外部错误释放指针。
  2. std::shared_ptr

    • 功能:共享所有权的智能指针,多个std::shared_ptr可以指向同一个对象,对象的释放会在最后一个std::shared_ptr被销毁时发生。
    • 用法
      • reset():释放当前对象,并可接收一个新的指针,同时更新引用计数。
      • get():返回存储的裸指针,使用时要注意避免在外部错误释放。
      • use_count():返回指向该对象的std::shared_ptr的数量,可用于调试和检查资源的共享情况。
  3. std::weak_ptr

    • 功能:不拥有对象所有权的智能指针,主要用于观察std::shared_ptr管理的对象,避免std::shared_ptr之间的循环引用问题。
    • 用法
      • lock():尝试将std::weak_ptr转换为std::shared_ptr,如果对象仍然存在,则返回一个有效的std::shared_ptr,否则返回nullptr

三、分配器详解及用法

  • std::allocator

    • 功能:用于管理内存分配策略,定义了如何分配和释放内存。
    • 用法
      • allocate(size_t n):分配存储n个T类型对象的内存空间,但不构造对象。
      • deallocate(T* p, size_t n):释放存储n个T类型对象的内存空间,前提是对象已被销毁。
      • construct(T* p, Args&&... args):在p位置构造一个T类型的对象,使用args作为参数。
      • destroy(T* p):销毁p位置的对象,但不释放内存。

四、其他内存管理工具

  • std::align:用于调整指针的对齐方式,以确保所分配内存满足特定对齐要求。
  • std::addressof:用于获取对象的实际地址。

五、运用示例

以下是一个使用<memory>头文件中智能指针和分配器的示例:

#include <iostream>
#include <memory>
#include <vector>class MyClass {
public:void doSomething() {std::cout << "Doing something" << std::endl;}
};int main() {// 使用std::unique_ptrstd::unique_ptr<MyClass> myUniquePtr(new MyClass());myUniquePtr->doSomething();// 使用std::shared_ptrstd::shared_ptr<MyClass> mySharedPtr1(new MyClass());std::shared_ptr<MyClass> mySharedPtr2 = mySharedPtr1;mySharedPtr1->doSomething();mySharedPtr2->doSomething();// 使用std::allocatorstd::allocator<int> alloc;int* p = alloc.allocate(1); // 分配内存alloc.construct(p, 42); // 构造对象std::cout << *p << std::endl;alloc.destroy(p); // 销毁对象alloc.deallocate(p, 1); // 释放内存return 0;
}

综上所述,<memory>头文件提供了丰富的内存管理工具,通过合理使用这些工具,开发者可以更高效地管理内存,提高程序的健壮性和可维护性。

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

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

相关文章

kubesphere中查看argocd登陆密码

获取argocd密码PASSWORDkubectl get secret argocd-initial-admin-secret -nargocd -o jsonpath="{.data.password}"|base64 -d 登陆: admin/PASSWORD

rockchip sdk使用make menuconfig无法删除选项文字(MobaXterm)

问题:在使用make menuconfig编辑内核配置时,按退格键删除不了相关选项,如下图所示:解决办法: 1. 在全局设置部分,把这里的退格键发送^H取消勾选:2. 在开启一个新会话时,进行同样的设置:

线控转向控制系统SbW

线控转向控制系统是一种将驾驶员对方向盘的操作信号转换为电信号,再传递给转向机,从而控制车轮完成相应的转向动作的技术。经纬恒润推出的线控转向控制系统SbW,分为路感模拟器与转向执行器,皆采用全冗余设计及主从控制方案,同时,按照ISO26262与DIN70065进行功能安全与降级…

uniapp使用scroll-view嵌套时不触发滚动事件

参考链接:微信文档:https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html uniapp文档: https://uniapp.dcloud.net.cn/component/scroll-view.html布局代码:<scroll-view scroll-y class="scroll-box" bindscrolltolower="scro…

OpenCL 调用关系

学习 OpenCL,概念很多,理解不深,所以看示例代码时比较糊涂。 于是,把调用关系简单画了个图:希望能加深理解吧。

SAP SMW0 配置EXCEL 上载模板,供其他tcode 下载模板

本文演示如何在自定义的tcoe 中,可以点击下载保存好的默认excel模板: 1. 打开 SMWO: 筛选 直接点新增 点浏览,找你本机的 excel 模板,进行上载 上载完后, 回到上载程序,点击,就能弹出需要下载的excel模板了

OP51常见问题(自动安装座板)

座板放置歪斜 1.夹爪夹住座板后,上升-->翻转180-->横移-->下降放置。需要准确放入铆钉内。 2.因为座板和夹爪都是金属件,所以旋转和横移过程中可能会发生水平方向的偏移,导致放置时对孔失败。 如果放置失败座板浮起,对光检测到了,上方的大压块会下压一次,尝试将…

YASKAWA点焊机器人维修的流程

在现代工业生产中,工业机器人发挥着至关重要的作用,而YASKAWA点焊机器人更是其中的佼佼者。然而,就像任何设备一样,机器人也会遭遇故障,这时候安川机器人维修、YASKAWA机器人维修以及工业机器人维修就显得尤为关键。一、机器人故障的常见类型YASKAWA点焊机器人在长时间的工…

Camstar中ToggleContainer标题样式改成建模框一样的

😘宝子:除非不再醒来,除非太阳不再升起,不然都请你好好生活,挣扎着前进,开心的笑。(●◡●)

Unpivot Columns与Pivot Columns的连用

一、背景 需要进行数据清洗二、 数据准备 三、操作步骤 3.1 上传数据 +3.2 UnpivotOtherColumns3.3 AddColumn 3.4 RemoveColumns3.5 Pivot

pd将字符串默认为NaN

一、背景 有些字符串会被pandas都城NaN。但是有时不想这么操作。二、数据准备 三、代码展示import pandas as pddf1 = pd.read_excel(NaNTest.xlsx) df2 = pd.read_excel(NaNTest.xlsx, na_values=[], keep_default_na=False)df = pd.concat([df1, df2], axis=1) print(df) 四、…

Power BI批量导入度量值

一、概述 1.1 适用场景 在PB中如果需要大量创建度量值,并对度量值的格式进行各种设置。如果一个个进行操作,则耗时耗力。 解决方法是将度量值的写在csv或者是txt文件中。然后读取文件,完成度量值的编写。1.2 关键节点编写大量度量值(我用Python,循环同一类形成度量值) 正则…