1、new 和 delete 运算符
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
new
和delete
是C++中的关键字,也是一种特殊的运算符。C++中如果要在堆内存中创建和销毁对象需要借助关键字new
和delete
来完成。
例如,
#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";
}