在 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信息则指向重新分配后新分配的内存。 新大小通过设置块的长度(以字节为单位)或项目数(如果未给出此参数)来指定应为此块分配多少空间。
使用标准库动态内存分配的好处
该库提供了多种类型的函数来管理动态内存,例如:
- 分配和释放堆上的内存块;
- 在分配的内存块之间复制数据;
- 在运行时访问已分配内存块的大小;
- 检查分配的内存块是否为空; 和
- 立即释放堆中的所有块。
相关文章
查找 C++ 中的内存泄漏
发布时间:2023/08/23 浏览次数:70 分类:C++
-
本文将使用 C++ 编程语言解释内存泄漏、其原因、如何识别它们以及如何防止它们。C++ 中的内存泄漏 如果程序员先前分配给一个目的的部分内存被用于另一个目的,则称内存“泄漏”。
C++ 中的余切函数
发布时间:2023/08/23 浏览次数:58 分类:C++
-
本文是关于 C++ 中三角函数的求解。 许多函数在数学库中很容易获得,但有些函数不可用,例如余切函数。对于这样的函数,我们将实现一些高效的用户定义函数。C++ 中的三角函数
C++ 错误 Error: Cannot Call Member Function Without Object
发布时间:2023/08/22 浏览次数:199 分类:C++
-
本文介绍了使用C++进行面向对象编程时,常见的错误“无法调用没有对象的成员函数”。 此外,它还提供了对该错误的潜在修复。修复C++中 Error: Cannot Call Member Function Without Object 错误
C++ std::bad_alloc 异常
发布时间:2023/08/22 浏览次数:119 分类:C++
-
这篇短文讨论了 C++ 中 std::bad_alloc() 异常的主要原因。 它还讨论了使用 C++ 异常处理顺利处理此运行时异常的方法。C++ 中的异常处理
C++ 中的 NULL 未声明错误
发布时间:2023/08/22 浏览次数:157 分类:C++
-
本文将讨论C++中NULL关键字以及未声明NULL的错误。C+ 中的 NULL 关键字 NULL是C++中的常量,用于将指针变量初始化为0。NULL和0可以互换使用。
跳转到 switch 语句中的 Case 标签
发布时间:2023/08/22 浏览次数:103 分类:C++
-
本文将讨论 C++ 中 switch 语句的使用。 此外,还将讨论使用 switch 语句时可能出现的错误,包括跳转到 case 标签错误。C++ 中的 switch 语句
解决C++ 中 - 'Python.h': No such file or directory 错误
发布时间:2023/08/22 浏览次数:118 分类:C++
-
本文将解释如何解决错误“Python.h”:没有这样的文件或目录。 当我们尝试在 C++ 中嵌入 Python 代码,但编译器无法在系统内部找到对 Python 的引用时,通常会发生这种情况。C++ 中 'Python.h': No