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可能会导致程序崩溃或者产生未定义的行为。