C++ new和delete运算符:分配和释放内存
C++ 增加了 new 运算符分配堆内存,delete 运算符释放堆内存。具体用法如下。
如果暂时不存储数据,初始化列表可以为空,或者数据类型后面没有()。如果内存申请成功,则 new 返回一个具体类型的指针;如果内存申请失败,则 new 返回 NULL。
new 申请内存空间的过程,通常称为 new一个对象。与 malloc() 相比,new 创建动态对象时不必为对象命名,直接指定数据类型即可,并且 new 能够根据初始化列表中的值进行初始化。
下面介绍 new 运算符常见的几种用法。
但是使用 delete 运算符释放数组对象时要在指针名前加上“[]”,格式如下:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
使用new运算符分配堆内存
new 运算符用于申请一块连续的内存,格式如下:new 数据类型(初始化列表);
上述格式中,数据类型表示申请的内存空间要存储数据的类型;初始化列表指的是要存储的数据。如果暂时不存储数据,初始化列表可以为空,或者数据类型后面没有()。如果内存申请成功,则 new 返回一个具体类型的指针;如果内存申请失败,则 new 返回 NULL。
new 申请内存空间的过程,通常称为 new一个对象。与 malloc() 相比,new 创建动态对象时不必为对象命名,直接指定数据类型即可,并且 new 能够根据初始化列表中的值进行初始化。
下面介绍 new 运算符常见的几种用法。
1) 创建基本数据类型对象
使用 new 创建基本数据类型对象,示例代码如下所示:
char* pc = new char; //存储char类型的数据
int* pi = new int(10); //存储int类型的数据
double* pd = new double(); //存储double类型的数据
- char 对象没有初始化列表,新分配内存中没有初始值;
- int 对象初始化列表为 10,即分配一块内存空间,并把 10 存入该空间;
- double 对象初始化列表为空,编译器会用 0 初始化该对象。
2) 创建数组类型对象
使用 new 创建数组对象,格式如下所示:new 数据类型[数组长度];
使用 new 创建数组的示例代码如下所示:char* pc = new char[10];
在上述代码中,指针 pc 指向大小为 10 的 char 类型数组。使用delete运算符释放堆内存
用 new 运算符分配的内存在使用后要及时释放以免造成内存泄漏,C++ 提供了 delete 运算符释放 new 出来的内存空间,格式如下:delete 指针名;
由上述格式可知,delete 运算符直接作用于指针就可以释放指针所指向的内存空间。但是使用 delete 运算符释放数组对象时要在指针名前加上“[]”,格式如下:
delete[]指针名;
如果漏掉了[],编译器在编译时无法发现错误,导致内存泄漏。示例
下面通过案例来演示 new 和 delete 的用法。C++ 代码如下:#include<iostream> using namespace std; int main() { int* pi = new int(10); //创建一个int对象,初始值为10 cout<<"*pi="<<*pi<<endl; *pi = 20; //通过指针改变内存中的值 cout<<"*pi = "<<*pi<<endl; //创建一个大小为10的char类型的数组 char* pc = new char[10]; for(int i = 0;i < 10;i++) pc[i] = i + 65; //向数组中存入元素 for(int i = 0;i < 10;i++) cout<<pc[i]<<" "; cout<<endl; delete pi; //释放int对象 delete []pc; //释放char数组对象 return 0; }运行结果:
*pi=10
*pi = 20
A B C D E F G H I J
- 第 5 行代码使用 new 创建了一个 int 对象,初始值为 10;
- 第 6 行代码通过指针 pi 输出内存中的数据,输出结果为 10;
- 第 7~8 行代码通过指针 pi 修改内存中的数据为 20,并输出,输出结果为 20;
- 第 10~12 行代码使用 new 创建一个大小为 10 的 char 类型数组,并通过 for 循环为数组赋值;
- 第 13~14 行代码通过 for 循环输出数组中的元素,数组中的元素成功输出;
- 第 16~17 行代码使用 delete 运算符释放 int 对象和 char 类型数组对象。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。