关于使用子函数里分配的内存的一个体会

今天和同学讨论时碰到这么一个问题,代码如下:

#include<iostream>
using namespace std;

int* allot_memery(int length)
{
	int *a = new int [length];
	for(int i = 0; i < 5; i ++)
		a[i] = i;
	return a;
}
int main()
{
	int *b = allot_memery(5);
	cout << b[2] << endl;
	return 0;
}

当时我的第一反应这样调用是不行的,因为内存是在子函数里分配的,子函数结束后该内存是会被系统回收的,但是测试时发现b[2]有值且值为2,当时很疑惑,为什么会这样?

后来和同学讨论,明白是个什么情况,由new分配的内存,一般是只能通过delete释放掉,或者是在main函数结束后由系统回收。这里allot_memery()函数里分配的内存,是不会在该函数调用完毕后就被回收的,同时b指向了这块的内存的首地址。一般说的不要使用子函数里分配的内存是指:在子函数里分配的内存,你是不知道编译器在哪里给它分配的,如果没有及时回收或者调用,很容易造成内存泄露。同时这里子函数分配的a是不能使用的,它是会在子函数结束后被系统回收的,因此不能在子函数外调用数组a的。

所以在main函数里,让指针b指向这块内存,是可以正常使用的,只是要注意在使用完后要delete掉,以免内存泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值