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)  //判定返回是否为空指针
{
  // 内存分配错误
}

标签: C++, 内存, int, 分配, Type, 动态内存, cin, new

相关文章推荐

添加新评论,含*的栏目为必填