在 C++ 中分配和释放内存
编译器自动控制分配给其他编程语言(如 Java 和 Python)中的变量的内存。 但在C++中,情况并非如此。
自创建以来,内存分配和释放一直是 C++ 语言不可或缺的一部分。 它负责管理程序中的动态内存,包括分配程序执行期间要使用的内存、不再需要时释放分配的内存以及确定程序结束时分配的内存会发生什么情况。
内存分配和释放由操作系统的虚拟内存管理器管理,该管理器使用分页技术。
C++ 编程语言提供了几个分配和释放内存的函数。 这些函数包括 malloc、calloc、realloc、free、new 和 delete。
让我们从 new 和 delete 运算符开始。
使用 new 和 delete 运算符分配和释放内存
new 运算符
new
运算符为指定类型的对象分配内存。 首先,它在内存中创建一个新对象,然后可以使用值对其进行初始化。
如果未指定值,则使用默认构造函数来初始化对象。 new 运算符的语法是:
pointer-variable = new data-type
在这种情况下使用类型数据类型的指针。 任何内置数据类型(包括数组)或任何用户定义的数据类型(包括结构和类)都可以用作数据类型。
如果程序执行过程中可用内存不足怎么办?
如果堆中没有足够的内存可供分配,则新请求将失败并抛出 std::bad alloc 类型的错误消息; 但是,如果 nothrow 与 new 运算符一起使用,则在这种情况下它会返回 NULL 指针。 因此,在运行程序之前查找 new 的指针变量至关重要。
delete 运算符
delete
运算符释放或取消分配由 new 运算符分配的内存。 删除运算符的语法如下:
delete pArray;
这里,pArray指的是用new运算符分配的数组。
通常,删除运算符执行两个功能:
- 首先,它通过调用其析构函数来销毁该对象。
- 它释放内存。
使用 new
和 delete
运算符的示例:
#include <iostream>
using namespace std;
int main() {
int* x;
x = new int;
*x = 34;
cout << *x << endl;
delete x;
return 0;
}
在此示例中,我们首先使用 new 运算符分配内存,然后使用 delete 运算符释放内存。
单击此处检查上述代码的工作情况。
使用 C 标准库分配和释放内存
使用 malloc()
、free()
和 realloc()
,C 标准库可以更轻松地分配和释放内存。 这些函数在 C++ 语言中可用。
malloc() 函数
malloc()是C++编程语言中的一个函数,用于分配指定大小的连续内存空间。 它用于为变量、数组和其他数据结构分配动态内存。
malloc() 函数采用三个参数:
- 第一个参数指定要分配的字节数。
- 第二个参数指定要分配的数据类型。
- 第三个参数是存储分配的数据的地址。
free() 函数
C++ 中的 free()
函数释放或取消分配先前使用 malloc()
运算符分配的内存区域。 它将这个内存区域返回给系统,以便以后可以重用。
realloc() 函数
realloc()
是一个可以改变内存块大小的函数。 它用于更改分配的大小,通常在分配耗尽时扩大分配的大小。
realloc()
接受三个参数:指向旧分配的指针、新分配的信息以及新分配的新大小。
old指针指向重新分配前原来分配的内存块,new信息则指向重新分配后新分配的内存。 新大小通过设置块的长度(以字节为单位)或项目数(如果未给出此参数)来指定应为此块分配多少空间。
使用标准库动态内存分配的好处
该库提供了多种类型的函数来管理动态内存,例如:
- 分配和释放堆上的内存块;
- 在分配的内存块之间复制数据;
- 在运行时访问已分配内存块的大小;
- 检查分配的内存块是否为空; 和
- 立即释放堆中的所有块。
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。