C++内new运算符分配堆内存,delete运算符释放堆内存,等同C内malloc和free
目录
new是在堆区申请一块连续的内存空间,如果申请成功:返回内存指针;失败:返回NULL。
new申请内存空间的过程,称为new一个对象
1.new是关键字,不需要引用头文件
malloc()是函数,需要头文件:
#include<stdlib.h> // include<malloc.h>;
2.new创建动态对象时会自动调用对象的构造函数;
3.new能够根据初始化列表中的任意值进行初始化,
malloc 无法为创建的对象进行初始化,仅仅calloc()将创建的内容默认初始化为0,且不能修改其他初始化值
数据类型 *指针变量 = new 数据类型; //默认值为随机值
eg:int * a=new int;
数据类型 *指针变量 = new 数据类型(初始值);
eg:int * a1=new int(10);
数据类型 *指针变量 = new 数据类型{初始值};
eg:int * a2=new int{20};
数据类型 *指针变量 = new 数据类型[数组长度];//没有初始化默认值是随机值
数据类型 *指针变量 = new 数据类型[数组长度]{初始化列表};
void show(int* a)//将创建的对象中数据打印
{
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int* p = new int[10] ;
创建10长度的int数组,因为没有初始化数据:都是随机值
int* p2 = new int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//创建10长度的int数组,用初始化列表将数组内容初始化
int* p3 = new int[10] {1, 2, 3, 4, 5};
创建10长度的int数组,未初始化的后五位数据都是“0”
show(p);
show(p2);
show(p3);
return 0;
}
代码运行如下:
用new运算符分配的内存在使用后要及时释放内存空间以免造成内存泄漏,delete将自动调用其析构函数。
delete 因new 创建的对象种类而对应不同格式
//new创建单个对象
delete 指针名;//释放单个的内存对象(变量)
//new创建的数组或者字符串等多变量集合
delete []指针名;//释放申请的数组对象(变量)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
void show(int* a)
{
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int* p = new int[10] ;
int* p2 = new int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int* p3 = new int[10] {1, 2, 3, 4, 5};
char* p4 = new char[15] {"hello 2024!"};
string* p5 = new string{ "hello 2024" };
show(p);
show(p2);
show(p3);
puts(p4);
cout<< *p5 << endl;
delete []p;
delete []p2;
delete []p3;
delete []p4;
delete p5;
return 0;
}
代码运行输出如下:
1.有new必delete,配对使用!避免内存泄漏等严重后果;
2.1new1delete,不要多次delete同一new创建的动态内存,C++标准指出,这样做的结果将是不确定的,这意味着什么情况都可能发生;
3.delete只对new,不能delete释放不是动态创建的内存;
4.对空指针使用delete是安全的。
1.delete数组时,格式错误(单一对象)
int* a = new int[5] {};
delete a;
//错误1 :
new 创建的是int类型的数组
//正确:
delete数组格式因该为:delete[]a;
delete释放的具体格式需要依据new申请的内容而定:
当new申请创建的是单一变量时,delete 单一变量即可;
而new创建的如若是数组集合类型变量,则格式为:delete [] 变量名,"[]" 区别于多次释放,直至完尽,如果用释放单一变量格式只释放一次,内存未完全释放,依旧存在内存泄漏等问题。
2.delete错误释放同一内存区域多次
int* b = new int;
int* c = b;
delete b;
delete c;//此句多余造成错误
不要使用两个指针指向同一动态内存申请空间,避免重复释放引发的错误
3.delete错误释放非动态内存
int arr[5];
int* d = arr;
delete d;
//错误3,delete不能释放非动态内存
4.delete空指针
int *a=nullptr;
delete a;
//正确,delete 空指针是安全的
delete NULL;
//语法错误,这条语句没有意义