在C++中,new和delete 是用于动态内存分配和释放的关键字。
new是在堆区申请一块连续的内存空间,如果申请成功,则返回内存指针;如果申请失败,则返回NULL;new申请内存空间的过程,通常称为new一个对象。与 malloc()相比:
1.new是关键字,不需要引用头文件(malloc需要引用stdlib.h或者malloc.h)
2.new创建动态对象时会自动调用对象的构造函数;
3.new能够根据初始化列表中的值进行初始化。
1.创建单个变量(对象)
数据类型 *指针变量 = new 数据类型; //默认值为随机值
数据类型 *指针变量 = new 数据类型(初始值);
数据类型 *指针变量 = new 数据类型{初始值};
//动态创建基本类型对象(变量)
int main()
{
int* p1 = new int;//这个没有初始化,随机值(0xcdcdcdcd)
cout << *p1 << endl;
int* p2 = new int();//写了初始化列表,没有给值默认为0
cout << *p2 << endl;
int* p3 = new int(100);//初始化为100
cout << *p3 << endl;
int* p4 = new int{200};//初始化为200(列表初始化的方式)
cout << *p4 << endl;
return 0;
}
2.创建数组
数据类型 *指针变量 = new 数据类型[数组长度];//没有初始化默认值是随机值
数据类型 *指针变量 = new 数据类型[数组长度]{初始化列表};
int main()
{
int* p1 = new int[10];//创建10长度的int数组,都是随机值
for (int i = 0; i < 10; i++)
cout << p1[i]<<" ";
cout << endl;
int* p2 = new int[10] {1,2,3,4,5,6,7,8,9,10};//创建10长度的int数组,并初始化为1~10
for (int i = 0; i < 10; i++)
cout << p2[i]<<" ";
cout << endl;
int* p3 = new int[10] {1,2,3,4,5};//创建10长度的int数组,并初始化为1,2,3,4,5,0,0,0,0,0
for (int i = 0; i < 10; i++)
cout << p3[i] << " ";
cout << endl;
return 0;
}
用new运算符分配的内存在使用后要及时释放以免造成内存泄漏,C++提供了delete运算符释放new出来的内存空间,并自动调用其析构函数。格式如下:
delete 指针名;//释放单个的内存对象(变量)
delete []指针名;//释放申请的数组对象(变量)
delete有两种使用方式,需要配合new的方式使用:
1.如果new创建的是单个变量(对象),则使用delete 指针名;
2.如果new创建的是数组变量(对象),则使用delete []指针名;
#include
using namespace std;
int main()
{
int* p1 = new int; //创建int,随机值,在vs2022中是-842150451(0xcdcdcdcd)
int* p2 = new int(10);//创建int,初始化为10
char* p3 = new char[10];//创建长度为10的char数组,随机值(在vs2022中是0xcd)
char* p4 = new char[10] {"趣字节"};//创建长度为10的char数组,初始化为"趣字节"
cout << *p1 << endl << *p2 << endl;
cout << p3 << endl;
cout << p4 << endl;
delete p1;//释放p1指向的动态内存
delete p2;//释放p2指向的动态内存
delete[]p3;//释放p3指向的动态内存,是数组
delete[]p4;//释放p4指向的动态内存,是数组
return 0;
}
注意:
1.一定要配对的使用new和delete,否则出现内存泄漏;
2.不要多次释放同一段动态内存,C++标准指出,这样做的结果将是不确定的,这意味着什么情况都可能发生;
3.不能使用delete释放不是动态创建的内存;
4.对空指针使用delete是安全的。
int main()
{
int* p1 = new int[5];
delete p1;//错误1,使用new []分配,应该使用delete []p1;
int* p2 = new int;
int* p3 = p2;
delete p2;
delete p3;//错误2,多次delete同一段内存
int arr[5];
int* p4 = arr;
delete p4;//错误3,delete不能释放非动态内存
int* p5 = NULL;
delete p5;//正确,delete 空指针是安全的
delete NULL;//语法错误,这条语句没有意义
return 0;
}
delete []中的方括号告诉程序,应释放整个数组,而不仅仅是指针指向的一个元素。如果使用new时,不带方括号,则使用delete时,不带方括号。如果使用new时带方括号,则使用delete时也应带方括号。对于C++标准来说,new和delete的格式不匹配导致的后果是不确定的。
本篇完.