当前位置:首页 > 网络技术 > c++释放内存的方法(c++ 获得内存使用情况)

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

longge2022-03-24 01:47:20网络技术83

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

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。#转载请注明出处!
  • 随机文章
  • 热门文章
  • 热评文章

“c++释放内存的方法(c++ 获得内存使用情况)” 的相关文章

一直在使用的免费日本CDN加速Incapsula(国内免费cdn加速)

一直在使用的免费日本CDN加速Incapsula(国内免费cdn加速)

我的博客使用的是美国空间,网络线路经常抽风和访问速度时好时坏是必须的,遂找了个免费日本CDN加速Incapsula,至今一直在用其日本节点。Incapsula每月50GB流量限制,CDN节点主要是在美...

原生javascript删除html标签属性的方法removeAttribute()(html删除线标签属性)

原生javascript删除html标签属性的方法removeAttribute()(html删除线标签属性)

jquery使用removeAttr()方法删除标签属性,原生javascript使用removeAttribute()方法删除标签属性。两个方法的名称差不多。 HTML代码: <d...

Jmeter中正则表达式提取器使用详解_java(jmeter的正则表达式提取器)

Jmeter中正则表达式提取器使用详解_java(jmeter的正则表达式提取器)

目录 在使用Jmeter过程中,会经常使用到正则表达式提取器提取器,虽然并不直接涉及到请求的测试,但是对于数据的传递起着很大的作用,本篇博文就是主要讲解关于正则表达式及其在Jmeter的...

基于Lombok集成springboot遇到的坑_java(springboot lombok)

基于Lombok集成springboot遇到的坑_java(springboot lombok)

目录 Lombok集成springboot遇到的坑 问题 原因 springboot引入Lombok Lombok集成springboot遇...

Java中多线程Reactor模式的实现_java(java多线程的实现方式)

Java中多线程Reactor模式的实现_java(java多线程的实现方式)

目录 1、 主服务器 2、IO请求handler+线程池 3、客户端 多线程Reactor模式旨在分配多个reactor每一个reactor独立拥有一个selector,...

opencv java windows 环境搭建

opencv java windows 环境搭建

博文目录 文章目录 OpenCV 下载安装 Java 加载 dll 库 Maven 工程配置 测试 OpenCV 加载是否正常 工具类 Ma...