C++ new和delete动态分配和释放内存

关于C++的关键字兼运算符: new 和 delete

new

new关键字其实就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new关键字开辟的空间在堆内存上,而一般声明的变量存放在栈内存上.通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数,另外需要注意的是,new的使用格式,new出来的是一段空间的首地址.所以一般需要用指针来存放这段地址


为什么需要new来开辟内存空间:

比如说数组的长度是预先定义好的,在整个程序中固定不变,但C++ 不允许定义元素个数不确定的数组,例如:

int n;//未进行定义的变量n
int a[n];  //这种定义是不允许的

但是在实际的编程中,往往会出现所需的内存空间大小取决于实际要处理的数据多少,而实际要处理的数据数量在编程时无法确定的情况。如果总是定义一个尽可能大的数组,又会造成空间浪费.何况,这个“尽可能大”到底应该多大才够呢

为了解决上述问题,C++提供了一种动态内存分配机制 ,使得程序可以在运行期间,根据实际需要,要求操作系统临时分配一片内存空间用于存放数据.此种内存分配是在程序运行中进行的,而不是在编译时就确定的,因此称为“动态内存分配”

总结:动态内存分配是一种,内存分配是在程序运行中进行的,而不是在编译时就确定的内存分配方式


C++ 中,通过new运算符来实现动态内存分配,new运算符的第一种用法如下:

T *p = new M;

其中M任意类型名,p类型为T*的指针

这个语句会动态分配出一片大小为sizeof(M)字节大小的内存空间,且将这段内存空间的起始地址(首地址)赋值给int类型的指针p,例如:


典型的new使用方式

int *p;
p=new int;
*p=5;

第一行 :建立类型为int的指针p
第二行p=new int此行动态分配了一片4个字节大小(int)的内存空间,而指针p指向指向这片空间
第三行:通过p读写这片空间


在使用new动态分配内存空间的同时对指针值进行定义

int* p = new int(123);//可以之间在new对象中进行初始化
cout<< *p << endl;//输出结果为 “123”

使用new动态分配内存一个任意大小的数组

例如:

T *p =new M[N];

在以上代码中
M任意类型名
p是类型为T*的指针
N代表示元素个数
[]内的值可以为任何值为正整数的表达式(表达式内可包含你变量和函数调用等值),以上语句动态分配出N x sizeof(M)个字节的内存空间这片空间的起始地址被赋值给p,例如:

//todo使用new申请多个对象,例如申请1024个int对象如下:
	int* p2 = new int[10];//用[]指定对象的个数
	cout << "使用new申请多个对象的结果为:\n\n";
	for (int i = 0; i < 10; i++)
	{
		p2[i] = i + 1;
		cout << p2[i]<< endl;//打印指针数组时直接输入数组名即可 因为数组名就是数组指针的首地址
	}

	delete[] p2;//如果new的时候用了[],则释放的时候使用delete[]操作符

结果:
在这里插入图片描述

注意: 如果new的时候用了[],则释放的时候使用delete操作符后面也要跟上一个[]符号,表示释放数组中的所有元素


delete

程序从操作系统动态分配所得的内存空间在使用完后应该释放,交还操作系统,以便操作系统将这片内存空间分配给其他程序使用.C++ 中提供了delete 运算符,用以释放动态分配的内存空间.delete运算符的基本用法如下:

在动态分配一般变量的内存时:

int p=new int;
delete p;

在动态分配数组变量的内存时:

int p=new int[10];
delete []p;

其中,p是指向动态分配内存的指针,且p必须指向动态分配(new)的内存空间,否则运行时将报错,例如:

int* p = new int;
*p = 5;
delete p;
delete p;  //本句会导致程序出错

int* p = NULL;//将p这个指针变量设置为NULL,防止野指针的出现和内存泄漏

上面的第一条delete语句正确地释放了动态分配的4个字节内存空间,第二条delete语句会导致程序出错,因为p所指向的空间已经释放,此时指针变量p虽然不再是指向动态分配的内存空间的指针了,但此时p这个指针还存在,但此指针已不指向任何一段内存,为了 防止内存的泄漏和野指针的出现,我们还需将p这个指针变量设置为NULL


注意:🎯

1如果动态分配了一个数组,但是却用delete p的方式释放,没有用[],则编译时没有问题,运行时也一般不会发生错误,但实际上会导致动态分配的数组没有被完全释放

2.牢记,用 new 运算符动态分配的内存空间,一定要用 delete 运算符释放.否则,即便程序运行结束,这部分内存空间仍然不会被操作系统收回,从而成为被白白浪费掉的内存垃圾.这种现象也称为内存泄露

3.如果一个程序不停地进行动态内存分配而总是没有释放,那么可用内存就会被该程序大量消耗,即便该程序结束也不能恢复.这就会导致操作系统运行速度变慢,甚至无法再启动新的程序.但是,只要重新启动计算机,这种情况就会消失

4.编程时如果进行了动态内存分配,那么一定要确保其后的每一条执行路径都能释放它,另外还要注意,释放一个指针,并不会使该指针的值变为 NULL(也就是说释放后指针的指向的变量的值不变)

来自
C++ new和delete(C++动态分配和释放内存)🔍
源自C++ 虚方法项目

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值