设为首页 - 加入收藏
广告 1000x90
您的当前位置:144177黄大仙有求必应 > 静态存储分配 > 正文

函数里的局部变量在函数退出后会不会自动释放?

来源:未知 编辑:admin 时间:2019-07-21

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  函数退出后,指针变量本身(4个字节,一般在栈上)会被释放,但它所指向的内存区域不会被释放。

  楼主的例子里,如果在method()里不释放b指向的空间,那么当method()退出时,b指向的空间不会被自动释放,而b这个指针变量不再存在了。这样一来b指向的空间就永远地泄漏了,因为再也没有指针指向它,你永远找不到它了。

  如果出于某种原因不想在method里释放这块空间,可以在method()里把b的值赋给一个全局指针变量,以后再释放这个全局变量。

  局部变量肯定会释放,一般由内核在栈上释放,假如在函数里申请了,就得记得,那个申请到的地址释放后,指向的指针会成野指针。

  当函数调用完之后a所占用的内存控件就被释放掉了,实际上局部变量的存储空间都是放在栈上面的,当函数返回之后,关于此函数的栈数据都被弹出,函数内部的局部变量占用的内存空间也被释放。但是你通过malloc函数分配的内存空间并不是在栈上,而是在另一个特殊的区域,也就是堆,堆中分配的内存是不能自动被释放的,必须要程序员手动释放,在c中提供了free函数对malloc分配的内存空间进行释放,如果不释放就会造成内存泄漏。

  不知道有没有面向对象语言的基础,例如C#,Java,C++。在C#和Java中都提供了一种叫垃圾回收器的机制,可以自动回收堆内存,而不需要程序员手动释放,这给了程序员极大的方便,也极大的避免了C和C++中的内存泄漏的问题。在C++中对象的创建如果是通过new关键字来创建的,那么对象使用完成之后必须通过delete关键字进行释放内存控件。因为实际上new关键字将对象分配在堆内存。

本文链接:http://that-a-way.com/jingtaicunchufenpei/410.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top