当前位置: 首页 > ai >正文

STL-从list节点创建和释放展开(内存管理)

0 内存管理概述

list的内存管理,实际上就是对list节点的管理。容器每增加或删除一个节点,都涉及内存的分配和释放。

0.1 为何会有内存管理?

通常来说,某个程序在运行初期总会向系统申请一定的内存,只有当已申请的内存不够时,才会在此向系统申请。这一设计一方面是为了降低频繁的系统调用,另一方面也是为了提高内存分配效率。

也就是说,对于任何一个程序,其内部都有一个,所谓“局部内存管理器”。本节所讲的内存管理指的便是这个“局部内存管理器”,用于管理STL相关容器的内存分配。

0.2 STL中区分内存分配和构造/析构

在这里,我们首先要区分两点:内存空间的配置/释放对象内容的构造/析构

在对象的构造和析构中,主要涉及变量的初始化和部分申请内存的释放。
程序只要运行,就离内存的分配和释放。

为了体现这两者的差别,我们看placement new的使用:

在以往的使用习惯中,我们常见的C++用法是:

#include <iostream>using namespace std;
class A{
public:int a;A(int value):a(value){};
};int main(){A * a_ptr = new A(10);cout << a_ptr->a << endl;
}

而placement new的用法,允许你在一块儿指定的地址上构建:

#include <iostream>
#include <new>
#include <malloc.h>
using namespace std;
class A{
public:int a;A(int value):a(value){};
};int main(){void * n_ptr= malloc(sizeof(A));cout << n_ptr << endl;new (n_ptr) A(10);cout << n_ptr << endl;cout << ((A *)n_ptr)->a << endl;
}

1 节点的创建、释放、构造和析构

1.1 基本形式

在这里插入代码片

1.2 全局的构造和析构

在1.1中,我们使用到了全局的构造和析构函数,其具体内容如下:

// construct.h中
template <class T1, class T2>
inline void construct(T1 *p, const T2 & value){new (p) T1(value);// 调用T1::T1(value);
}//destory的多个版本
template <class T>
inline void destroy(T * pointer){pointer->~T();//调用T::~T();
}

这里的构造和析构函数有多个版本(用于接收不同的入口参数)(这里仅列举两个。)

仔细观察上述函数可知,这个函数是一个“套壳”函数。归根节点,该函数调用的是对象T1/T的构造函数和析构函数。对于list来说,调用的就是list::list()和list::~list()(暂时不考虑入口参数)。

对于其他STL容器来说也一样。某个容器具体的构造和析构定义在自定的类定义中。

这里仅列举几个有代表性的list类的构造和析构。

http://www.xdnf.cn/news/8807.html

相关文章:

  • Claude Code Agent 模式深度解读(一)!Anthropic提出的下一代Code CLI工具
  • 第四章 面向对象(基础)
  • ​​UniBoard:私有化部署,导航笔记文件一站式管理
  • JavaScript 中的 structuredClone() 如何彻底改变你的对象复制方式
  • 几个直觉泵问题
  • 线程池优雅关闭的哲学
  • java基础知识回顾3(可用于Java基础速通)考前,面试前均可用!
  • 空间计算的未来:在通用芯片上构建高可靠系统
  • 沙井SMT贴片加工核心工艺解析
  • JVM 的垃圾回收机制
  • Linux线程互斥与同步(下)(30)
  • 软件质量保证与测试实验
  • 历年北京师范大学保研上机真题
  • 数据库设计核心流程
  • 探索智能仓颉
  • 软件设计师-错题笔记-面向对象技术
  • 继电器相关梳理
  • pytorch基础
  • LabVIEW开发FPGA磁声发射应力检测系统
  • C++与Python中除法运算的区别(易错)
  • Linux路径解析指南:逻辑路径 vs 实际路径详解
  • Linux 文件系统
  • 第5章:任务间通信机制(IPC)全解析
  • 自定义 win10 命令
  • Leetcode 3269. 构建两个递增数组
  • 低空经济与新质生产力
  • SHAP分析+贝叶斯优化BP神经网络+新数据预测+K折交叉验证+相关性分析+孤立森林异常值处理,Matlab代码实现,作者:机器学习之心!
  • python36
  • 佳源科技退卷IPO:曾于2023年7月过会,原计划募资约9亿元
  • linux-du指令