C++标准模板(STL)- C 内存管理库 - 扩张之前分配的内存块 (std::realloc)

C 内存管理库

扩张之前分配的内存块

std::realloc

void* realloc( void* ptr, std::size_t new_size );

重分配给定的内存区域。它必须是 std::malloc() 、 std::calloc() 或 std::realloc() 先前分配的,且仍未被 std::free() 释放,否则行为未定义。

重分配按以下之一进行:

a) 若可能则扩张或收缩 ptr 所指向的既存内存区域。区域的内容直到新旧大小的较小者都保留为更改。若区域扩张,则数组新部分的内容是未定义的。

b) 分配大小为 new_size 字节的新内存块,复制大小等于新旧大小较小者的内存区域,并释放旧块。

若无足够内存,则不释放旧块并返回空指针。

ptr 是空指针,则行为同调用 std::malloc(new_size) 。

new_size 为零,则行为是实现定义的:可以返回空指针(该情况下可能或可能不释放旧内存块),或可能返回某个不可用于访问存储的非空指针。

要求下列函数是线程安全的:

  • operator new 及 operator delete 的库版本
  • 全局 operator new 与 operator delete 的用户替换版本
  • std::calloc 、 std::malloc 、 std::realloc 、 std::aligned_alloc (C++17 起) 、 std::free

对这些分配或解分配特定存储单元的函数调用以单独全序出现,并且在此顺序中,每个解分配调用先发生于下个分配(若存在)。

(C++11 起)

参数

ptr-指向要被重分配的内存区域的指针
new_size-数组的新大小

返回值

成功时,返回指向新分配内存起始的指针。为避免内存泄漏,返回的必须以 std::free() 解分配指针。原指针 ptr 被非法化,且任何对它的访问是未定义行为(即使重分配是原位的)。

失败时,返回空指针。原指针 ptr 保持合法且可能需要以 std::free() 解分配。

注意

因为重分配可能涉及逐位复制(无论是扩展还是压缩),调用 realloc 后,只有可平凡复制 (TriviallyCopyable) 类型才能安全地于内存块的保留位置访问。

一些非标准库定义类型特性“可逐位移动 (BitwiseMovable) ”或“可重定位 (Relocatable) ”,这描述不拥有下列内容的类型:

  • 外部引用(例如链表或树的保有另一元素引用的结点),和
  • 内部引用(例如,可能保有另一成员地址的成员指针)。

重分配其存储后,能访问这种类型的对象,即使其复制构造函数非平凡。

调用示例

#include <cstdlib>
#include <new>
#include <cassert>
#include <iostream>class MallocDynamicBuffer
{char* p;
public:explicit MallocDynamicBuffer(std::size_t initial = 0) : p(nullptr){std::cout << __FUNCTION__ << "  " << __LINE__ << std::endl;resize(initial);}~MallocDynamicBuffer(){std::cout << __FUNCTION__ << "  " << __LINE__ << std::endl;std::free(p);}void resize(std::size_t newSize){std::cout << __FUNCTION__ << "  " << __LINE__<< "  size: " << newSize << std::endl;if (newSize == 0)  // 此检查并非严格需要,但零大小 realloc 于 C 中弃用{std::free(p);p = nullptr;}else{if (void* mem = std::realloc(p, newSize)){p = static_cast<char*>(mem);}else{throw std::bad_alloc();}}}char& operator[](size_t n){std::cout << __FUNCTION__ << "  " << __LINE__ << std::endl;return p[n];}char operator[](size_t n) const{std::cout << __FUNCTION__ << "  " << __LINE__ << std::endl;return p[n];}
};int main()
{MallocDynamicBuffer buf1(1024);buf1[5] = 'f';buf1.resize(10); // 收缩assert(buf1[5] == 'f');buf1.resize(1024); // 增长assert(buf1[5] == 'f');return 0;
}

输出

MallocDynamicBuffer  12
resize  24  size: 1024
operator[]  47
resize  24  size: 10
operator[]  47
resize  24  size: 1024
operator[]  47
~MallocDynamicBuffer  18

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

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

相关文章

二叉树的构建和遍历(oj题)

一、题目链接 https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking 二、题目思路 利用先序遍历的方法&#xff0c;构建二叉树。为了保证在递归中&#xf…

USB主机模式——Android

理论 摘自&#xff1a;USB 主机和配件概览 | Connectivity | Android Developers (google.cn) Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件&#xff08;实现 Android 配件协议的硬件&#xff09;。 在 USB 主机模式下&#xff0…

Redis 中的 Zset 数据结构详解

目录 用法 1. 增 2. 删 3. 查 4. 交&#xff0c;并 编码方式 应用场景 Redis 中的 Zset&#xff08;有序集合&#xff09;是一种将元素按照分数进行排序的数据结构。与上篇写的SetRedis 中的 Set 数据结构详解不同&#xff0c;Zset 中的每个元素都关联一个浮点数类型的…

Jmeter的线程组之间传递参数

使用jemter做接口测试&#xff0c;有时候需要会遇到不同线程组之间调用相同变量的情况&#xff0c;最多见的就是token的传递&#xff0c;网上有很多处理方法&#xff0c;这里只记录setProperty的办法&#xff0c;一招鲜走遍天&#xff01; 首先我有两个线程组&#xff1a; 线程…

Oracle中两张表具有相同结构,如何将一张表内容全部插入到另一个表中

在Oracle中&#xff0c;如果两张表具有相同的结构&#xff0c;你可以使用INSERT INTO ... SELECT语句将一张表的内容插入到另一张表中。以下是一个示例&#xff1a; 假设有两个表&#xff1a;table1 和 table2&#xff0c;它们具有相同的列结构。要将 table1 的所有内容插入到…

vm:为虚拟机配置多个虚拟网卡(ubuntu20.04)

前言&#xff1a; 环境&#xff1a;虚拟机 ubuntu 20.04 要求&#xff1a;如标题&#xff0c;但是这里针对的是 ubuntu 20.04&#xff0c;对于其他操作系统&#xff0c;可以找一下其他操作系统对应的配置文件是什么 vm 添加虚拟网卡 首先进入 vm&#xff1a; 点击设置&#xf…

JVM监控-JMX探针的安装和使用

jvm监控的搭建和使用 ​ Java Management Extensions&#xff08;JMX&#xff09;是一种Java标准&#xff0c;用于管理和监控Java应用程序&#xff0c;特别是分布式系统。它提供了一种标准化的方式来管理应用程序的各种方面&#xff0c;包括性能监控、配置更改、事件通知等。目…

nodemcu32s 和 mini D1 组局域网并用 webSocket 通信

实现思路 使用 mini D1 来搭建一个 webSocket 服务&#xff0c;然后使用 nodemcu32 连接&#xff0c;然后就可以进行通信了。 服务端代码&#xff08;mini D1&#xff09; 在代码中主要是需要控制好 loop 函数中的延时&#xff0c;也就是最后一行代码 delay&#xff0c;如果…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

C语言HTTP编程:深入探索与实战应用

C语言HTTP编程&#xff1a;深入探索与实战应用 在当今的互联网时代&#xff0c;HTTP协议扮演着至关重要的角色&#xff0c;它使得客户端与服务器之间的通信成为可能。而C语言&#xff0c;作为一种高效且灵活的编程语言&#xff0c;同样在HTTP编程领域有着广泛的应用。本文将从…

MathType2025数学公式编辑器有哪些新增功能?

在当今科技飞速发展的时代&#xff0c;数学、科学和工程教育领域对于精确性和效率的要求日益增高。随着教育数字化的不断深入&#xff0c;传统的教学方式和科研手段正逐渐被新型的数字工具所取代。在这一过程中&#xff0c;MathType作为一款强大的数学公式编辑器&#xff0c;其…

Oracle大表在线重新分区

Oracle的在线重定义对一个分区表重新进行分区&#xff0c;同时不影响DML交易数据操作&#xff0c;实现的大致过程是什么&#xff0c;在生产过程中存在的风险是什么&#xff0c;如何做到对一个3亿的数据表重新分区&#xff1f; Oracle的在线重定义对一个分区表重新进行分区的大…

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测

多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测 目录 多维时序 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量时间序列预…

React-组件通信

组件通信 概念&#xff1a;组件通信就是组件之间的数据传递&#xff0c;根据组件嵌套关系的不同&#xff0c;有不同的通信方法 父传子 基础实现 实现步骤&#xff1a; 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 props说明 1.…

哪个牌子的无线麦克风好用?全网揭秘无线麦克风一拖二哪个牌子好

​在浩瀚的音频产品海洋中&#xff0c;如何挑选一款适合自己的无线领夹麦克风&#xff1f;这确实是一个值得深思的问题。今天&#xff0c;我为你精心推荐这几款无线领夹麦克风&#xff0c;它以其卓越的音质、稳定的性能和便捷的无线连接&#xff0c;赢得了众多用户的青睐。无论…

独家首发 | 基于多级注意力机制的并行预测模型

基于Transformer-BiGRUGlobalAttention-CrossAttention的并行预测模型! 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;Transformer-BiGRU预测模型-CSDN博客 独家原创 | 基…

Caused by: java.lang.IllegalStateException

今天在做 Room 迁移的时候&#xff0c;想测试Room 是否按预期工作&#xff0c;报上面错误&#xff1a; 检查发现 我报 它放在主线执行的使用报错了&#xff0c; 对数据库的操作由于是耗时操作&#xff0c;所以必须放在子线程中完成&#xff0c; 不允许在主线程上访问数据库&am…

机器学习算法手撕(一):KD树

import math import matplotlib.pyplot as pltclass Node:def __init__(self, data, leftNone, rightNone):self.data dataself.left leftself.right right# 创建KDTree类 class KDTree:def __init__(self, k):self.k kdef create_tree(self,dataset,depth):if not dataset…

辅导男朋友转算法岗的第2天|self Attention与kv cache

文章目录 公式KV CacheMHA、MQA、GQA 面试题为什么除以 d k \sqrt{d_k} dk​ ​Multihead的好处decoder-only模型在训练阶段和推理阶段的input有什么不同&#xff1f;手撕必背-多头注意力 公式 $ \text{Output} \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) \times …

C#,JavaScript实现浮点数格式化自动保留合适的小数位数

目标 由于浮点数有漂移问题&#xff0c;转成字符串时 3.6 有可能得到 3.6000000000001&#xff0c;总之很长的一串&#xff0c;通常需要截取&#xff0c;但按照固定长度截取不一定能使用各种情况&#xff0c;如果能根据数值大小保留有效位数就好了。 C#实现 我们可以在基础库里…