今天和同学讨论时碰到这么一个问题,代码如下:
#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掉,以免内存泄露。