C++ 侯捷 内存管理

C++ 的内存获取机制:

void* p1 = malloc(512);
free(p1);complex<int>* p2 = new complex<int>;
delete p2;void* p3 = ::operator new(512);
::operator delete(p3);//GNUC
void* p4 = alloc::allocate(512);
alloc::deallocate(p4, 512);//GNUC4.9
void* p5 = allocator<int>().allocate(7); //分配7个int
allocator<int>().deallocate((int*)p5, 7);

表达式 new delete

new的步骤:

  1. 申请一段指定类大小的空间:new —> operator new —> malloc
  2. 转化为对应类类型
  3. 调用类构造函数

在operator new的源码中,有个std::nothrow_t& _THROW0()参数,表示这个函数不抛异常,取而代之的是返回一个空指针,用户通过判断是否为空指针来判断是否分配成功。

array new、array delete

array new是分配一个对象数组,通常容易犯得一个错误是在delete的时候忘记在delete后面加[]导致内存泄漏的问题。

replacement new

允许我们将对象分配在已经构建的内存中

他不会进行内存分配,而是调用重载的operator new,用于返回已经分配好的内存,转型、调用构造函数。

#include<new>
char* buf = new char[sizeof(Complex)* 3];
Complex* pc = new(buf) Complex(1, 2); // replacement new!!!
Complex* pc = new Complex(1, 2); 

函数operator new()、operator delete()

重载::operator new / ::operator delete

全局重载:

inline void* operator new(size_t size){cout << "global new() " << endl;return malloc(size);
}inline void* operator new[](size_t size){cout << "global new[]() " << endl;return malloc(size);
}

在类中重载::operator new / ::operator delete更有用(array new / array delete重载也是一样的方法):

我们重载这两个函数,是为了接管内存分配的工作,接管它了有什么用呢?很有用,比如说可以做一个内存池(这个就是之前讲STL的时候的__pool_allocator)

为什么重载的operator new是static呢?因为希望实现的这个内存池是这个类的所有对象都能使用的!

我们可以重载operator new()的前提是:每一个版本的声明都必须有独特的参数列,其中第一个参数必须是size_t,其余参数以new所制定的replacement arguments为初值。

只有在上述的重载replacement new抛出异常的时候,才会调用相应的operator delete(这个需要自己去实现),因为在重载replacement new抛出异常,那么说明内存分配不成功,但是可能已经申请好内存,那么我们应该去处理申请好的这个内存。

static allocator

new handler

=default   =delete

delete 我不要,default  使用默认的版本

分配器   allocator

分配器分配途径:allocator—>allocate—>::operator new—>malloc

我们想要把operator new / delete抽取出来形成单独的一个类allocator,是的这个类和内存分配的分配细节剥离开,这样,需要内存管理的类,就调用allocator。这就是STL中分配器的实现思路。

VC6的标准分配器

这个编译器的allocator没有任何特殊设计,单纯是调用malloc,分配是以对象元素为单位

GNU C 2.9

设计是内存池的思想。16个指针指向16条链表,每条链表分配不同大小的内存空间,从左往右每一条链表间隔8个字节。理论上是这样的,但是在代码实现的时候,是首先申请一个大的内存块,然后在大的内存块上进行切分,所以不同链表之间会有连线。

每个链表会申请nx8x20x2字节的内存空间,n代表第n条链表,20表示将内存最多切分成20个子内存块,2表示会申请2倍大小的内存用于战备。这些内存空间是cookie free的。

如果申请的内存大于128字节,那么就有malloc来管理,就不归这个pool管理了。

源码中deallocate没有free操作(源于先天设计缺陷),即只要被pool申请空间之后,就不会再还回操作系统了。对于一个程序来说,这个也没有什么大不了的,但是对于一台机器来说,不止运行一个程序,这是有弊端的。这可能就是为什么GNU4.9把它替换回去的原因?

参考文章:侯捷C++八部曲笔记(五、内存管理)_侯捷内存管理-CSDN博客 

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

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

相关文章

Hbase详解

Hbase 概念 base 是分布式、面向列的开源数据库&#xff08;其实准确的说是面向列族&#xff09;。HDFS 为 Hbase 提供可靠的底层数据存储服务&#xff0c;MapReduce 为 Hbase 提供高性能的计算能力&#xff0c;Zookeeper 为 Hbase 提供稳定服务和 Failover 机制&#xff0c;…

OR-NeRF论文笔记

OR-NeRF论文笔记 文章目录 OR-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Background4 Method4.1 Multiview Segmentation4.2 Scene Object Removal 5 ExperimentsDatasetsMetricsMultiview SegmentationScene Object Removal 6 Conclusion 论文概述 目的&am…

Redis 笔记

文章目录 安装 & 启动杂乱String字符串 key-valueList 有序重复列表Set 无序不重复列表SortedSet 有序集合Hash 哈希Stream 消息队列订阅模式 学习地址&#xff1a;https://www.bilibili.com/video/BV1Jj411D7oG/ 安装 & 启动 安装包地址&#xff1a; https://github.…

【软件工程】漫谈增量过程模型:软件开发的逐步之道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 增量过程模型&#xff08;Incremental Process Model&#xff09; 主要特点和阶段&#xff1a; 优点&#xff1…

TCP 协议为什么要设计三次握手 TCP 协议,是一种可靠的,基于字节流的,面向连接的传输层协议。

文章目录 TCP 协议为什么要设计三次握手TCP 协议&#xff0c;是一种可靠的&#xff0c;基于字节流的&#xff0c;面向连接的传输层协议。TCP 通信双方的数据传输是通过字节流来实现传输的客户端向服务端发送连接请求并携带同步序列号 SYN。 今天我们来谈谈tcp的三次握手 TCP 协…

C++ dynamic_cast学习

dynamic_cast是将一个基类对象指针(或引用)转换到继承类指针; 可以在执行期决定真正的类型; 与static_cast一样,dynamic_cast的转换也需要目标类型和源对象有一定的关系:继承关系; 更准确的说,dynamic_cast是用来检查两者是否有继承关系; 用法 dynamic_cast <ty…

Vue2+element-ui 实现select选择器结合Tree树形控件实现下拉树效果

效果&#xff1a; DOM部分 &#xff1a; // 设置el-option隐藏的下拉选项&#xff0c;选项显示的是汉字label&#xff0c;值是value // 如果不设置一个下拉选项&#xff0c;下面的树形组件将无法正常使用 <el-form-item label"报警区域" prop"monitorId"…

如何让python在手机上运行,python程序在手机上运行

大家好&#xff0c;给大家分享一下python怎么在手机上运行爱心代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1. 写在前面的话 天天都在PC端运行Python代码的我&#xff0c;今天突然灵光一现&#xff0c;想着是不是能够在移动端运行P…

【STM32】TIM1在电机应用时的注意事项

互补通道OC和OCN的输出极性 OC1和OC1N同时使能的时候&#xff0c;两个才是互补的&#xff0c;OC相对OCREF高电平有效&#xff0c;OCN相对OCREF低电平有效。当OC1或OC1N只选中一个通道&#xff0c;那么就没有互补的概念&#xff0c;都是OCxREF有效时OC或OC1N有效。 举例&#x…

CSS 缩减顶部

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

通用搜索的工作原理

了解 Google 的通用搜索结果为何如此重要&#xff0c;通用搜索的发展方向&#xff0c;以及它对您意味着什么。 让我们从回答一个显而易见的问题开始&#xff1a; 什么是通用搜索&#xff1f; 网络上有一些通用搜索的定义&#xff0c;但我更喜欢从马的嘴里听到这样的事情。 …

搞懂Vue一篇文章就够了

vue算是小编接触过时间最长的前端框架了&#xff0c;下面来总结一下最实用的知识点&#xff0c;一篇文章从入门到熟练工 目录 一、概念二、常用特性1.拦截器和路由篇1.1 拦截器和路由配置 2.传值篇2.1父子组件互相传值2.2路由跳转传值 3.接口封装3.1 api接口配置 4.组件封装5. …

GO语言工具函数库--Lancet

支持300常用功能的开源GO语言工具函数库–Lancet lancet&#xff08;柳叶刀&#xff09;是一个全面、高效、可复用的go语言工具函数库。lancet受到了java apache common包和lodash.js的启发。 特性 全面、高效、可复用300常用go工具函数&#xff0c;支持string、slice、dateti…

与擎创科技共建一体化“数智”运维体系,实现数字化转型

小窗滴滴小编获取最新版公司简介 前言&#xff1a; 哈喽大家好&#xff0c;最近分享的互联网IT热讯大家都挺喜欢&#xff0c;小编看着数据着实开心&#xff0c;感谢大家支持&#xff0c;小编会继续给大家推送。 新岁即将启封&#xff0c;我们一年一期的运维干货年末大讲也要…

【halcon深度学习】dev_display_dl_data 移植到C# 上篇

效果展示 前言 在研究halcon深度学习的时候,会发现halcon的例程里面用到了大量的二次封装库函数。这些库函数内部也是由基础的算子组成。我们在halcon的开发环境里面用的很爽,但是一旦要在C#中使用,就会报错。 一开始,我想避开这个移植过程,直接使用halcon引擎(HDevEngi…

深入Mybatis数据源

数据源是持久层框架中最核心的组件之一&#xff0c;在实际工作中比较常见的数据源有 C3P0、Apache Common DBCP、Proxool 等。作为一款成熟的持久化框架&#xff0c;MyBatis 不仅自己提供了一套数据源实现&#xff0c;而且还能够方便地集成第三方数据源。 javax.sql.DataSourc…

scala--面向对象(2)

package scala06object scala07_ABSClass {// 抽象属性 抽象方法 def main(args: Array[String]): Unit = { // 抽象类用法 // 实例化子类 val student0 = new Student08 student0.sayHi("lisi")// 直接实例化抽象类(匿名子类) //匿名子类 是多态的一种体现 (父…

C++系列-第1章顺序结构-3-输出类cout

C系列-第1章顺序结构-3-输出类cout 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述输出类cout的用法 cout介绍与基本用法 在C中&#xff0c;cout 是用于输出&#xff08;打印&#xff09;数据的工具&…

文华财经鬼谷数据期货量化分析系统指标公式

鬼谷数据量化主图源码 安装流程——打开文华财经软件——右上角指标管理器——新建指标——复制源码——安装成功 鬼谷数据主图源码 安装流程——打开文华财经软件——右上角指标管理器——新建指标——复制源码——安装成功文华财经期货软件擒龙量化主图指标公式HH:HHV(HIGH…

系列四、Eureka自我保护

一、Eureka自我保护 1.1、故障现象 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不会注销任何微服务。如…