C++ 动态内存分配
有时在执行时需要分配要输入的数据。例如,员工名单在组织中雇佣新员工时增加,在人员离开组织时减少。这称为管理内存。现在,让我们讨论动态内存分配的概念。
内存分配
保留或提供变量的空间称为内存分配。内存分配有两种方式:
- 静态分配或编译时分配 – 静态内存分配意味着为变量提供空间。变量的大小和数据类型是已知的,并且在整个程序中保持不变。
- 动态分配或运行时分配 – 在动态分配中,内存是动态分配的。在这种类型的分配中,变量的确切大小事先不知道。指针在动态内存分配中起到重要作用。
为什么需要动态内存分配?
在程序处于运行状态时,我们可以动态地分配存储空间,但变量不能随意创建。因此,动态内存分配有两个条件 –
- 需要动态内存空间。
- 存储用于访问内存中的变量的地址。
同样,我们也可以对内存中的变量进行释放。
在C++中,内存分为两部分 –
- 栈 – 所有在任何函数内部声明的变量从栈中获取内存。
- 堆 – 它是程序中未使用的内存,通常用于动态内存分配。
使用new运算符进行动态内存分配
为了动态地分配空间,使用new运算符。它表示在自由存储上创建内存分配的请求。如果内存可用,内存将被初始化,并将该空间的地址返回给指针变量。
语法
指针变量 = new 数据类型;
指针变量是指针数据类型。数据类型可以是int,float,string,char等。
示例
int *m = NULL // 最初我们有一个空指针
m = new int // 请求内存给变量
也可以将以下语句放在一行中直接声明 –
int *m = new int
初始化内存
我们也可以使用new运算符初始化内存。
例如
int *m = new int(20);
Float *d = new float(21.01);
分配内存块
我们也可以使用new运算符分配特定数据类型的内存块(数组)。
例如
int *arr = new int[10]
这里我们为十个整数动态分配了内存,并返回数组的第一个元素的指针。因此,arr[0]是第一个元素,依此类推。
注意
- 创建常规数组和使用new创建块之间的区别是,编译器会自动释放常规数组,而块会动态创建直到程序员手动删除或程序终止。
- 如果堆内存中没有空间,new请求将失败并抛出异常(std::bad_alloc),除非我们在new运算符中使用nothrow。因此,最佳实践是先检查指针变量。
代码:
int *m = new(nonthrow) int;
if(!m) // check if memory is available
{
cout<< "No memory allocated";
}
现在我们已经动态分配了内存。让我们学习如何删除它。
删除操作符
我们使用 delete 操作符在 C++ 中删除已分配的空间。
语法
delete 指针变量名
示例
delete m; // 释放变量 m
delete [] arr; // 释放一块内存
示例演示动态内存分配
// The program will show the use of new and delete
#include
using namespace std;
int main ()
{
// Pointer initialization to null
int* m = NULL;
// Request memory for the variable
// using new operator
m = new(nothrow) int;
if (!m)
cout<< "allocation of memory failed\n";
else
{
// Store value at allocated address
*m=29;
cout<< "Value of m: " << *m <
输出
Value of m: 29
Value of f: 75.25
Value store in block of memory: 1 2 3 4 5