c++中new的用法详解

1. 什么是new?

在C++中,new是一种动态内存分配的方式。动态内存分配是指在程序运行时根据需要分配内存。因为动态内存分配是在运行时进行操作,因此它相比于静态内存分配更加灵活实用。

1.1 new 的格式

new 的格式为:

类型 *指针变量名 = new 类型 (初始值);

其中,类型为需要动态分配的数据类型,指针变量名为变量名,初始值为可选项,可以为类型的初始值。例如:

int *p = new int(10);

上述代码定义了一个指向int类型的指针变量p,并分配了一个值为10的int类型的动态内存。

1.2 new 的返回值

new 分配的内存地址通过指针返回给指针变量名。如果内存分配失败,则返回值为 NULL。例如:

int *p = new int;

if (p == NULL) {

cout << "内存分配失败!" << endl;

}

2. new 的作用

new 的作用主要有三个:

2.1 堆内存分配

new 分配的内存空间属于堆内存,也就是动态分配的内存空间。堆内存分配需要使用者手动释放,否则会造成内存泄漏。

例如:

int *p = new int;

*p = 10;

delete p;

上述代码中,使用new动态分配了一个int类型的内存空间,并将其地址赋值给指针变量p。然后,将具体数据10存储到内存空间中。最后使用delete释放内存空间。

2.2 初始化内存空间

new 同时可以对动态分配的内存空间进行初始化。例如:

int *p = new int(10); //动态分配一个int类型内存空间并设置初始值为10

2.3 动态数组分配

new 可以用来分配动态数组,在new后面跟上[],就可以分配多个变量的内存空间。

int *p = new int[10]; // 分配10个int类型变量的内存空间

上述代码中,动态分配了10个int类型的内存空间。

3. new 和 delete 的配对使用

new 分配出来的内存空间需要使用者手动释放,否则会造成内存泄漏。手动释放动态分配的内存空间需要使用 delete。

3.1 释放内存空间

使用delete释放动态分配的内存空间有两种方式:

3.1.1 释放单个内存空间

如果使用new动态分配了单个内存空间,需要使用单个delete释放内存空间。例如:

int *p = new int;

delete p;

3.1.2 释放多个内存空间

如果使用new动态分配了多个内存空间,需要使用多个delete[]释放内存空间。例如:

int *p = new int[10];

delete[] p;

上述代码中,动态分配了10个int类型的内存空间,使用delete[]释放内存空间。

3.2 delete 的处理方法

如果需要释放的内存空间是NULL指针,则直接忽略这条delete语句。例如:

int *p = NULL;

delete p;

如果需要释放的内存空间已经释放过了,则会产生未定义的行为。例如:

int *p = new int;

delete p;

delete p; // 可能会产生未定义的行为

4. new 的使用建议

使用new分配动态内存空间需要注意以下几点:

4.1 确认内存释放

new 动态分配出来的内存空间需要用delete及delete[]释放,否则会造成内存泄漏。同时,需要保证释放的内存空间和分配的内存空间是一一对应的。

4.2 避免二次释放内存空间

二次释放动态内存空间会导致未定义的行为。为了避免这种情况的发生,可以在释放内存空间后将指针赋值为NULL。

4.3 尽量少使用new

new 分配的内存空间需要使用者手动释放,而C++标准库提供的容器类可以避免程序员手动管理内存。因此,在使用C++时,尽量少用new进行内存分配。

5. 总结

new 是C++语言中重要的内存分配方式,它具有动态分配内存空间、初始化内存空间以及分配动态数组等作用。new 动态分配出来的内存空间需要使用 delete 或者 delete[]手动释放。使用new需要注意内存释放、避免二次释放内存空间以及尽量少使用new等问题。不正确的使用new可能会导致程序崩溃或者产生未定义的行为。

后端开发标签