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

C++标准模板(STL)- C 内存管理库 - 分配并清零内存 (std::calloc)

C 内存管理库

分配并清零内存

std::calloc

void* calloc( std::size_t num, std::size_t size );

分配 num 个大小为 size 的对象的数组,并初始化所有位为零。

若分配成功,则返回指向为任何对象类型适当对齐的,被分配内存块最低(首)字节的指针。

size 为零,则行为是实现定义的(可以返回空指针,亦可返回某个不可用于访问存储的非空指针)

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

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

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

(C++11 起)

参数

num-对象数量
size-每个对象的大小

返回值

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

失败时,返回空指针。

注意

因为对齐要求,分配的字节数不需要等于 num*size

将所有位初始化为零不保证浮点数或指针各被初始化到 0.0 与空指针值(尽管大多数平台上这为 true )

最初( C89 中),添加对零大小的支持是为了接纳下面这种代码

调用示例

#include <iostream>
#include <cstdlib>
#include <string>class MyString : public std::string
{
public:MyString() : std::string("GGX"){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()
{auto point = (int*)std::malloc(1 * sizeof(int));//打印未知字符std::cout << "std::malloc: " << point[0] << std::endl;MyString* point1 = (MyString*)std::calloc(4, sizeof(MyString)); // 分配并清零 4 个 int 的数组MyString* point2 = (MyString*)std::calloc(1, sizeof(MyString[4])); // 同上,直接指名数组类型MyString* point3 = (MyString*)std::calloc(4, sizeof * point3);  // 同上,不重复类型名if (point2){for (int n = 0; n < 4; ++n) // 打印数组{std::cout << "point2[" << n << "] == " << point2[n] << std::endl;}}std::free(point1);std::free(point2);std::free(point3);return 0;
}

输出

std::malloc: 16387904
point2[0] ==
point2[1] ==
point2[2] ==
point2[3] ==

http://www.lryc.cn/news/358210.html

相关文章:

  • 嵌入式开发面试问题总结(持续更新)
  • 意外发现openGauss兼容Oracle的几个条件表达式
  • 使用Keepalived提高吞吐量和负载均衡ip_hash.
  • 网络故障与排除(一)
  • C++之运算符重载
  • 使用springdoc-openapi-starter-webmvc-ui后访问swagger-ui/index.html 报错404
  • 深入理解计算机系统 家庭作业4.52
  • 深度学习:手撕 RNN(2)-RNN 的常见模型架构
  • 【Linux进程篇】Linux进程管理——进程创建与终止
  • Python爬虫实战(实战篇)—17获取【CSDN某一专栏】数据转为Markdown列表放入文章中
  • Go语言-big.Int
  • getContentView(mBinding.getRoot()); 会导致内存泄露吗?里面有SurfaceView ViewBinding
  • 基于transformers框架实践Bert系列6-完形填空
  • cesium绘制编辑区域
  • 数据库攻防之MySQL
  • 八国多语言微盘微交易所系统源码 单控点控 K线完好
  • 爪哇,我初学乍道
  • 【MySQL精通之路】全文搜索(5)-限制
  • 动态规划part03 Day43
  • Activity->Activity生命周期和启动模式
  • 浅谈网络安全态势感知
  • cesium本地文档-天空盒-arcgis切片404-服务查询
  • OpenMv图片预处理
  • Springboot 实战运用
  • kafka的安装与简单使用
  • 【服务器部署篇】Linux下Node.js的安装和配置
  • 【OrangePi AIpro】香橙派 AIpro 为AI而生
  • AES算法
  • 自主创新助力科技强军,麒麟信安闪耀第九届军博会
  • Android Retrofit 封装模版