当前位置:首页 > 生活百科

c语言申请内存空间(c语言动态分配内存数组)

栏目:生活百科日期:2025-01-23浏览:0

本期是C++基础语法分享的第八节,今天给大家来分享一下:

(1)内存分配和管理;

(2)malloc、free;

(3)new、delete;

(4)定位 new;

(5)delete this 合法吗?

(6)如何定义一个只能在堆上(栈上)生成对象的类?

内存分配和管理

malloc、calloc、realloc、alloca

malloc:申请指定字节数的内存。申请到的内存中的初始值不确定。

calloc:为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存的每一位(bit)都初始化为 0。

realloc:更改以前分配的内存长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。

alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。C99 中支持变长数组 (VLA),可以用来替代 alloca。

malloc、free

用于分配、释放内存

malloc、free 使用

申请内存,确认是否申请成功

char *str = (char*) malloc(100);assert(str != nullptr);

释放内存后指针置空

free(p); p = nullptr;

new、delete

new / new[]:完成两件事,先底层调用 malloc 分配了内存,然后调用构造函数(创建对象)。

delete/delete[]:也完成两件事,先调用析构函数(清理资源),然后底层调用 free 释放空间。

new 在申请内存时会自动计算所需字节数,而 malloc 则需我们自己输入申请内存空间的字节数。

new、delete 使用

申请内存,确认是否申请成功

int main(){    T* t = new T();     // 先内存分配 ,再构造函数    delete t;           // 先析构函数,再内存释放    return 0;}

定位 new

定位 new(placement new)允许我们向 new 传递额外的地址参数,从而在预先指定的内存区域创建对象。

new (place_address) typenew (place_address) type (initializers)new (place_address) type &[size]new (place_address) type &[size] { braced initializer list }

(1)place_address 是个指针

(2)initializers 提供一个(可能为空的)以逗号分隔的初始值列表

delete this 合法吗?

合法,但:

必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的

必须保证调用 delete this 的成员函数是最后一个调用 this 的成员函数

必须保证成员函数的 delete this 后面没有调用 this 了

必须保证 delete this 后没有人使用了

如何定义一个只能在堆上(栈上)生成对象的类?

只能在堆上

方法:将析构函数设置为私有

原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。

只能在栈上

方法:将 new 和 delete 重载为私有

原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。将 new 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。

“c语言申请内存空间(c语言动态分配内存数组)” 的相关文章

华为手机卡慢一招解决(如何处理手机网速慢问题)

手机与我们的生活息息相关,每天都要用到它,但手机毕竟是消耗品,用久了可能会卡顿,如果你用的是华为手机,今天教大家关闭这6个小机关,让你的手机焕然一新。一、关闭自...

macbook装windows系统多少钱(苹果windows驱动安装步骤)

苹果Macbook电脑安装win10系统图文教程(错误信息无法创建可引导的usb驱动器的解决方法)安装前的准备:8G以上U盘一个(提前备份数据,安装过程中将被格...

4k智能电视什么牌子好,4K智能电视真实测评

4K已经成为当下人们选购智能电视的一个衡量标准!4K电视受到众多消费者关注!想知道4k电视哪个牌子好?小编四处搜罗了一番,从高品质4K电视产品中优中选优,为大家...

excel判断函数的用处(excel if判断多个条件)

工作中经常碰到Excel里面的判断问题,比如,年终计算年终奖,对业绩高于60万的员工,给予A梯度年终奖,其它员工B梯度。对于这种,如果怎么样,那么就怎样的问题,...

养狗挣钱吗成本多少 (养殖宠物狗繁殖的利润)

好久没有去找小何了,今天特地打电话联系他问他最近的情况,他马上叫我过去他那里玩,说这几天下雨他在家里没有出去,我立马开车过去了,到他家里又是泡上好茶招待我,今天...

小白自学电商运营书籍推荐(零基础必看的两本运营书)

我觉得两本书就够了。在知乎上翻了十几个回答,发现动不动就是推荐十几二十本书,还有一两百本的书单(头秃),甚至还要教我怎么读书的书emmmm现在社会发展很快,到处...

容声电热水壶怎么使用(养生壶排名前十的品牌)

百元以下的电水壶中,奥克斯HX-128K1口碑佳,性价比也最高。而百元以上产品中,苏泊尔WF17C05B更值得购买。一杯热腾腾的水为寒冷的冬天带来不少温暖,电热...

可以在家里做的工作有哪些(手机上就能赚钱的项目)

小编曾经在网上看到过一个问题,问这个世界上缺什么最可怕?底下清一色的回答,这个世界上缺钱最可怕。今天小编就来给大家分享一下,如何在家赚钱?分享九个简单的,在家赚...

品牌讯景显卡怎么样(显卡厂商排名)

AMDCEOLisaSu在发布会上洋洋洒洒的介绍了RX6000系列显卡之后,第一批公版显卡已经在本月18日进行过首销了,当然公版的数量相比于玩家的数量来说肯定是...

如何做网页链接,网页制作费用明细

很多cpa广告联盟上的渠道主在进行网站关键词排名的时候常用方法之一就是建设网站的外部链接,对于网站的关键词排名来说,网站的内容和内链固然是很重要的,但是网站外链...