这个涉及到内存管理,函数的作用域问题。
这么和你讲ptr是func函数里面的一个变量这个你可以理解吗、?
我们所谓的局部变量其实就是在函数里面定义的变量叫局部变量。因为这个变量只能被该函数使用。 其它函数要想使用这个变量就必须得到这个变量的内存单元的地址例如func函数中的ptr变量只能被func函数使用,
当然其它函数要想使用ptr这个变量: 例如书中的ptr就是个指针变量。那么就是说其它函数要想修改这个变量的值得话就必须知道它的地址。因为ptr在内存中是有个物理单元的,是存在的bit位。
我们知道c的程序总是从main函数开始执行的对吧。那么main函数里面定义的变量就会在main函数执行的时候分配内存空间,一个函数一个栈帧。当一个函数执行结束在此栈帧中的所以内存单元就会释放。
根据书中说到:“ptr是局部变量,因此在func()函数退出后自动失效如果没有及时释放动态分配的内存单元,则在退出func()函数后再也找不到这些内存单元的地址。无法再使用” 这一段话就是说你应该在func()函数里面释放掉ptr指向的那些内存单元。
应该这样写:
void func()
{
int *ptr = new int(5);
........
free(ptr);//这就保证了在func函数完毕之前释放掉ptr指向的内存单元
}
看到了吧。 如果你不写 free(ptr);这句话 那么func函数一旦执行结束ptr的内存单元就没了, 也就原味着ptr不存在了 而你忘了释放ptr指向的内存单元啊!
没释放就意味着ptr指向的那块内存单元一直被占用着啊! 操作系统没法再使用那块空间!
你这个时候再来释放是不行的例如;
free(ptr);你在这么写也不可以了ptr已经死了。
ptr一死就意外着你再也找不回来那块内存空间! 什么?你还是蒙圈?
因为ptr本身的值就是这个时候不能再使用的那块内存空间的首地址啊
首地址都死了 在释放也不可以了因为 free(被释放的地址); 懂了吧。
所以说在ptr死之前拿到它的值这样 free(ptr);就ok了。
至于为什么函数一结束ptr就得死 这个我只能说你记住就可以。因为模拟现实就这样。解决现实问题。
此外:这种函数一结束局部变量就死 这是满足开发中的现实需求而产生的。
这种实现是基于数据结构中的栈结构实现。
好了。记住就可以。至于为什么这样··为什么那样··你以后慢慢就会知道。