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

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.dtcms.com/a/212888.html

相关文章:

  • Linux系统编程-DAY04
  • C语言初阶--操作符
  • 升级Win11后VMware虚拟机屏幕调整问题
  • 领域驱动设计与COLA框架:从理论到实践的落地之路
  • 数字信号处理大实验2.1(基础) 快速傅里叶变换与FFT的时域频域对称性质
  • 微软Build 2025五大AI发布
  • Spring Cloud项目登录认证从JWT切换到Redis + UUID Token方案
  • 前置过滤器和净水机安哪个?
  • git checkout 通配符
  • Kafka Consumer工作流程
  • JVM 的类加载机制
  • 贪心算法应用:贝尔曼-福特松弛问题详解
  • 贪心算法应用:Ford-Fulkerson最大流问题详解
  • 自训练NL-SQL模型
  • webpack优化方法
  • Linux系统之----磁盘硬件
  • 【C++进阶篇】红黑树的封装(赋源码)
  • 线程池实战——数据库连接池
  • Python中字典(dict)知识详解应用
  • Vue.extend
  • CentOS7更新 GLIBC 2.25
  • 区块链可投会议CCF C--APSEC 2025 截止7.13 附录用率
  • ISO 26262-5 区分失效模式
  • 阿里千问系列:Qwen3技术报告解读(下)
  • 英语科研词汇现象及语言演变探讨
  • 用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来!
  • YOLOV8涨点技巧之空间通道协作注意力(SCCA)-应用于自动驾驶领域
  • 类欧几里得算法(floor_sum)
  • git 把一个分支A的某一个 commit 应用到另一个分支B上
  • LLM 使用本地模型 提取新生成 文本 的token ID序列