在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。但可能存在有些情况内存需求只能在运行时确定。则就需要动态内存分配(new,delete),本文主要介绍C++ 动态内存分配(new,delete)。

1、new 和 delete 运算符

:在函数内部声明的所有变量都将占用栈内存。

:这是程序中未使用的内存,在程序运行时可用于动态分配内存。

newdelete是C++中的关键字,也是一种特殊的运算符。C++中如果要在堆内存中创建和销毁对象需要借助关键字newdelete来完成。

例如,

#include <iostream>
using namespace std;
class MyClass
{
    public:
       MyClass():i(0){}
       MyClass(int a):i(a){}
       virtual void foo(){ cout<<i<<endl;}
       int i;
};
void main()
{
       MyClass *p1 = new MyClass;
       MyClass *p2 = new MyClass(10);
       MyClass *p3 = new MyClass[20];
       delete p1;
       delete p2;
       delete[] p3;
}

注意:

1)C++中通过new关键字进行动态内存申请

2)C++中的动态内存分配是基于类型进行的

3)delete关键字用于内存释放

2、new关键字与malloc函数的区别

1)new关键字是C++的一部分,malloc是由C库提供的函数。

2)new以具体类型为单位进行内存分配,malloc以字节为单位进行内存分配。

3)new在申请单个类型变量时可进行初始化。malloc不具备内存初始化的特性。

3、C++动态分配内存异常机制

如我们分配一个很大的内存空间,会出现栈满,程序产生异常,程序崩溃。则需要引入异常机制。C ++提供了两种标准机制来检查分配是否成功。

1)处理异常,在分配失败时抛出bad_alloc类型的异常。如果抛出此异常并且未由特定处理程序处理,则程序执行将终止。

例如,

foo = new int [11]; 

2)使用nothrow,内存分配失败时,而不是抛出bad_alloc异常或终止程序,new返回的指针是空指针,程序继续正常执行 。

例如,

int * foo;
foo = new (nothrow) int [5];
if (foo == nullptr) {
  cout << "foo is null";
}