c++释放内存的方法(c++ 获得内存使用情况)

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

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 唐山大地震是哪一年发生的(唐山大地震是哪一年哪一月哪一日)

    1976年7月28日,就在所有人都在沉睡中的时候,剧烈的震感席卷全国。伴随着让人心惊的声音,原本高楼林立的唐山市,最后化成一片废墟。坍塌的桥梁,扭曲的铁路,就连地表也因地震出现多处…

    2022年6月7日 投稿
  • 中国三大舰队舰艇表(2021服役的军舰表)

    现阶段东海舰队共拥有13艘驱逐舰,17艘护卫舰,没有航母,没有075,没有055的东海舰队在中国三大舰队当中作战能力倒数,但是即便如此,拥有4艘现代,4艘052C,5艘052D,1…

    2022年5月31日
  • 股票融是什么意思(股票带融是什么意思)

    有些股票前面有个“融”字,代表着这只股票是融资融券标的股,正常情况下普通投资者都可以进行买卖交易,但只能用自己账户里的自有资金来买和用已经买到的股票来卖。 但如果你开通了融资融券的…

    2022年6月16日 投稿
  • 四万左右买什么车好(4万块钱能买什么车)

    有些车友,刚参加工作,手里不宽裕,但买车又是刚需,平时上班代步能遮风挡雨,周末可以带着家人出去游玩,有车总比没有车方便。如果车友想花4万多买轿车,最终绕不开这三款,皮实耐用、油耗经…

    2022年6月3日 投稿
  • 故宫门票当天可以买吗(故宫门票怎么当天买)

    去故宫玩要提前预约买票,总结了一下预约方法、注意事项、门票价格以及优惠政策,您可以“收藏”起来,以备后用。 【一些要注意的】 故宫关门比较早,尤其淡季,大家还是早点去。旺季8点30…

    2022年3月15日
  • 汽车销售排行榜(销量最好的汽车前十位)

    受国内疫情反复影响,各个行业都很难,其中汽车行业更是“难上加难”。除了拥有很多配套零件厂的上海长期封控之外,大家知道汽车行业近两年芯片供应压力比较大,多重因素下,4月国内车市出现大…

    2022年6月7日 投稿
  • 健康产业项目有哪些(十大健康创业项目)

    相信有一些朋友听说过,现在健康医疗是非常火爆,而且非常有前景的行业,所以有一部分朋友打算投资在健康行业,想要咨询一下,有没有合适的健康创业项目,那么今天就来跟各位详细介绍一下十大健…

    2022年5月18日
  • 抖音拉小黑屋多久恢复正常(抖音进了小黑屋严重吗)

    在抖音平台上面,肯定也需要先去了解一下平台的规则,并且在经营账号的时候也要遵守规则,如果不小心被永久封禁了,这种情况下,卖家们自然也是想要了解需要多久才能够恢复正常呢? 抖音账号被…

    2022年7月2日 投稿
  • 洗面奶排行榜(该如何选择洗面奶)

    用洗面奶洗脸的好处,使用洗面奶有助美肌。大多数早上不用洗面乳是为了“不给肌肤负担”、“不想在脸上落下更多的东西”。这种想法其实也是错误的。正确使用洗面乳有助于使肌肤变得更好。小编今…

    2022年6月19日 投稿
  • 即将规模化推送的华为鸿蒙(即将规模化推送的华为鸿蒙)

    上月月底,华为鸿蒙2.0系统开发者测试版正式更新,19款机型的设备可参与内测。最近,不少参与内测的小伙伴们展示了自己使用鸿蒙系统的视频,华为鸿蒙OS开机界面大有改变,正式脱离了安卓…

    2022年6月7日 投稿
品牌推广 在线咨询
返回顶部