C++ 的动态申请内存new与delete释放

C++内new运算符分配堆内存,delete运算符释放堆内存,等同C内malloc和free

目录

new:

一、利用new创建内存

二、new 与 malloc()

三、new运算符常见的几种用法

1.创建单个变量(对象)

2.创建数组

delete:

一、delete格式

注意:

二、错误示范:


new:

一、利用new创建内存

new是在堆区申请一块连续的内存空间,如果申请成功:返回内存指针;失败:返回NULL。

new申请内存空间的过程,称为new一个对象

二、new 与 malloc()

1.new是关键字,不需要引用头文件

malloc()是函数,需要头文件:

#include<stdlib.h> // include<malloc.h>;

2.new创建动态对象时会自动调用对象的构造函数;

3.new能够根据初始化列表中的任意值进行初始化,

malloc 无法为创建的对象进行初始化,仅仅calloc()将创建的内容默认初始化为0,且不能修改其他初始化值

三、new运算符常见的几种用法

1.创建单个变量(对象)

数据类型 *指针变量 = new 数据类型;  //默认值为随机值
eg:int * a=new int;

数据类型 *指针变量 = new 数据类型(初始值);
eg:int * a1=new int(10);

数据类型 *指针变量 = new 数据类型{初始值};
eg:int * a2=new int{20};

2.创建数组

数据类型 *指针变量 = 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;
}

代码运行如下:

delete:

用new运算符分配的内存在使用后要及时释放内存空间以免造成内存泄漏,delete将自动调用其析构函数。

一、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;
//语法错误,这条语句没有意义
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值