C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc)

2024-05-28 14:12

本文主要是介绍C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C 内存管理库

分配内存

std::malloc

定义于头文件 <cstdlib>

void* malloc( std::size_t size );

分配 size 字节的未初始化存储。

若分配成功,则返回指向分配的适合对任何标量类型对齐的内存块中,最低(首)字节的指针。

size 为零,则行为是实现定义的(可以返回空指针,或某个不可用于访问存储,但必须传递给 std::free 的非空指针)。

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

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

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

(C++11 起)

参数

size-要分配的字节数

返回值

成功时,返回指向新分配内存起始的指针。返回的指针必须用 std::free() 或 std::realloc() 解分配。

失败时,返回空指针。

注意

任何情况下,此函数不调用构造函数或初始化内存。无能保证调用匹配的解分配函数的预备使用的智能指针。 C++ 中偏好的内存分配方法是用 RAII 预备函数 std::make_unique 、 std::make_shared 、容器构造函数等,而在低层代码中为 new 表达式。

调用示例

#include <iostream>
#include <cstdlib>
#include <string>class MyString : public std::string
{
public:MyString() : std::string(){std::cout << __FUNCTION__ << std::endl;}MyString(size_type count, char ch): std::string(count, ch){std::cout << __FUNCTION__ << "  "<< static_cast<void *>(this) << std::endl;}~MyString(){this->~basic_string();std::cout << __FUNCTION__ << "  "<< static_cast<void *>(this) << std::endl;}
};int main()
{// 为 4 个 string 的数组分配足够空间if (auto point = (MyString*)std::malloc(5 * sizeof(MyString))){int i = 0;try{for (; i != 5; ++i) // 填充数组{new (point + i) MyString(5, 'a' + i);}for (int j = 0; j != 5; ++j) // 打印出来{std::cout << "point[" << j << "] == " << point[j] << std::endl;}}catch (...) {}for (; i != 0; --i) // 清理{point[i - 1].~MyString();}std::free(point);}
}

输出

MyString  0x887ac8
MyString  0x887ae0
MyString  0x887af8
MyString  0x887b10
MyString  0x887b28
point[0] == aaaaa
point[1] == bbbbb
point[2] == ccccc
point[3] == ddddd
point[4] == eeeee
~MyString  0x887b28
~MyString  0x887b10
~MyString  0x887af8
~MyString  0x887ae0
~MyString  0x887ac8

这篇关于C++标准模板(STL)- C 内存管理库 - 分配内存 (std::malloc)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010790

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve