首页 > 编程笔记

C++ new和delete运算符:分配和释放内存

C++ 增加了 new 运算符分配堆内存,delete 运算符释放堆内存。具体用法如下。

使用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类型的数据

上述代码分别用 new 创建了 char、int、double 三个对象。其中:

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

示例分析:

优秀文章