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

本期是C++基础语法分享的第八节,今天给大家来分享一下:(1)内存分配和管理;(2)malloc、free;(3)new、delete;(4)定位new;(5)deletethis合法吗?(6)如何定义一个只能在堆上(栈上)生成对象

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

(1)内存分配和管理;

(2)malloc、free;

(3)new、delete;

(4)定位 new;

(5)delete this 合法吗?

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

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

内存分配和管理

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) type
new (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 操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/29899.html

(0)
nan
上一篇 2021-09-26
下一篇 2021-09-26

相关推荐

  • 一万元公积金能贷多少住房款(公积金可以贷款多少)

    【前言】公积金贷款额度怎么算?公积金贷款能贷多少,各地政策不一,且差别巨大,但主要取决于公积金账户余额、缴存年限、月缴公积金额度、贷款人年龄;一般单人最高贷款50万左右,夫妻100万左右。公积金贷款额度怎么算公积金贷款计算,要根据还贷能力、房价成数、…

    2022-01-15 随笔
    0
  • 唇毛太长怎么办女孩(唇毛重怎么办)

    唇毛就是嘴唇上的汗毛,很多女性因为嘴唇上面有粗黑浓密的汗毛而自卑,有碍于美观。唇毛浓密,一般和肾上腺皮质激素分泌太多以及内分泌失调有关,可以通过多种方式去除。唇毛浓密的原因有哪些?肾上腺皮质激素是由脑…

    2021-12-02
    0
  • 华汇人寿最新情况怎么样?现任董事长是马彪

    公开简介显示,华汇人寿全称是华汇人寿保险股份有限公司,是经中国保险监督管理委员会批准,于2011年12月22日成立的全国性专业寿险公司,注册资本15亿元。那华汇人寿最新情况怎么样?下面,一起来了解一下。灵活就业死后有丧葬费吗,来看法律规定如果参加了社会保险,在缴费期间不幸身亡的,按照规定继承人是可…

    2021-12-27
    0
  • 其定位和运营方式介绍(微信公众号如何运营和管理)

    如何系统运营一个微信公众号?本文主要从以下七点来谈。1.为什么要选择微信平台?2.公众号定位3.内容运营4.粉丝运营5.资源积累6.粉丝互动7.盈利模式一、为什么要选择微信公众平台?目前,中国的微信公众号数量大概在2000万

    2021-11-30
    0
  • 金缕衣注音与译文(金缕衣古诗注释和译文)

    今天和‬大家分享‬~千古名篇‬~《金缕衣‬》全文如下:劝君莫惜金缕衣,劝君惜取少年时。(惜取一作:须取)花开堪折直须折,莫待无花空折枝。(花开一作:有花)杜秋娘(约791—?),《资治通鉴》称杜仲阳,后世多称为“杜秋娘”,是唐代金

    2021-11-28
    0
  • 做微创乳腺手术后悔死了(为什么会得乳腺结节)

    肖女士,45岁,宝鸡人,去年洗澡时无意间发现左乳房有肿块,就去医院体检被确诊为乳腺结节,其中最大的一个有3.5cm,而且右侧乳腺多发结节,并且有几个还是不规则形状的,这可把她吓坏了。但医生告诉她不用担…

    2022-02-09 随笔
    0

发表回复

登录后才能评论