2019.8.15C++基础学习笔记——动态内存分配教程
C++基础学习笔记——动态内存分配
C++中所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于用户输入。 在这些情况下,程序需要动态分配内存,C ++语言将运算符new和delete合成在一起。
new分配动态内存
关键字new根据变量类型来分配内存,分配使用完变量后用关键字delete释放内存。
new语法:Type* 变量名 = new Type;
分配数组:Type* 变量名 = new Type[元素数];
分配数组中元素数也可以是由用户自己输入的变量。
测试实例:
#include <iostream>
using namespace std;
int main()
{
int* a = new int; //为a分配整型动态内存
int n;
cin >> n; //输入分配的数组内存,n=3
char* b = new char[n]; //为b分配字符数组类型内存,数组容量为n
cin >> *a; //从键盘输入为a赋值
cin >> *b;
cin >> b+1;
cin >> b+2; //从键盘输入依次为b数组赋值
cout << endl <<“a=” << a << endl; //输出a为a指向数据的地址
cout << *a <<"*a=" << endl; //输出*a为a指向数据的值
cout << "b=" << b << endl; //输出整个数组
cout << "b[0b[1]b[2]=" << ]b[0] << "next" << b[1] << b[2] << endl;
cout << "*b*(b+1)*(b+2)=" << *b << "next" << *(b+1) << *(b+2) << endl;
//输出数组元素可以有两种方式
delete a;
delete[] b; //使用变量后要释放内存
system("pause");
return 0;
}
输入:3 1 2 3 4
输出:a=00044ED0
*a=1
b=234
b[0]b[1]b[2]=2next34
*b*(b+1)*(b+2)=2next34
P.S.在测试中发现对b数组元素赋值时cin >> b语句和cin >> *b语句似乎都能赋值成功,结果输出相同,语句实现是否一致存疑。
关键字new可对分配内存的变量进行初始化,关键字malloc则不能。
关键字new初始化语法:
int* pi = new int(1);
float* pf = new float(2.0f);
char* pc = new char('c');
new与malloc比较:
newmallocnew以具体类型为单位进行内存分配malloc以字节为单位进行内存分配new在申请单个类型变量时可进行初始化malloc不具备内存初始化的特性new关键字是C++的一部分malloc是由C库提供的函数
C++动态分配内存异常机制
计算机内存优先,如果分配一个很大的内存空间,会出现栈满,程序产生异常,程序崩溃。所以我们需要引入异常机制。C ++提供了两种标准机制来检查分配是否成功。
第一种是new默认自带的异常处理方法,使用此方法,在分配失败时抛出bad\_alloc类型的异常。如果程序分配内存失败抛出此异常并且未由特定处理程序处理,则程序执行将终止。
Type* 变量名 = new Type;//new定义语句自带异常处理,分配失败会退出程序
第二种方法是nothrow,在使用关键字new时加参数,在分配内存失败时不会默认直接自动终止,而是返回一个空指针。在调试时可以使用nothrow方法判定指针是否为空来确定内存分配是否成功。
int * a;
a = new (nothrow) int [5]; //使用nothrow方法
if (a == nullptr) //判定返回是否为空指针
{
// 内存分配错误
}