函数里的局部变量在函数退出后会不会自动释放?
如果是指针呢?voidClassA::method(){ClassB*b=newClassB();}当method()退出时b指向的空间会自动释放?...
如果是指针呢?
void ClassA::method(){
ClassB *b = new ClassB();
}
当method()退出时b指向的空间会自动释放? 展开
void ClassA::method(){
ClassB *b = new ClassB();
}
当method()退出时b指向的空间会自动释放? 展开
3个回答
展开全部
会自动释放,指针也是一样的。
局部变量的作用域是定义该变量的函数或定义该变量的复合语句。只在定义它的函数或复合语句范围内有效,只能在定义它的函数或复合语句内才能使用它们。局部变量的生存期是从函数被调用的时刻算起到函数返回调用处的时刻结束。
扩展资料:
局部变量的作用域说明:
1、主函数main()中定义的变量也只在主函数中有效,而不能因为在主函数中定义在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。这一点是与其他语言不同的,应予以注意。
2、不同函数中可以使用相同名字的变量,它们代表不同的对象,分配不同的单元,互不干扰。例如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单元,互不干扰。
3、形式参数是属于被调函数的局部变量。例如上面f1函数中的形参a,也只在f1函数中有效,其他函数可以调用f1函数,但不能引用f1函数中的形参a。
4、在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
参考资料来源:百度百科-局部变量
展开全部
局部变量肯定会释放,一般由内核在栈上释放,假如在函数里申请了,就得记得,那个申请到的地址释放后,指向的指针会成野指针。
关于局部变量里的函数:
在C语言中在函数里面定义的局部变量确实会在函数结束之后被释放掉,
例如:
void print()
{int a=0;
printf("%d",a);}
当函数调用完之后a所占用的内存控件就被释放掉了,实际上局部变量的存储空间都是放在栈上面的,当函数返回之后,关于此函数的栈数据都被弹出,函数内部的局部变量占用的内存空间也被释放。但是你通过malloc函数分配的内存空间并不是在栈上,而是在另一个特殊的区域,也就是堆,堆中分配的内存是不能自动被释放的,必须要程序员手动释放,在c中提供了free函数对malloc分配的内存空间进行释放,如果不释放就会造成内存泄漏。
不知道有没有面向对象语言的基础,例如C#,Java,C++。在C#和Java中都提供了一种叫垃圾回收器的机制,可以自动回收堆内存,而不需要程序员手动释放,这给了程序员极大的方便,也极大的避免了C和C++中的内存泄漏的问题。在C++中对象的创建如果是通过new关键字来创建的,那么对象使用完成之后必须通过delete关键字进行释放内存控件。因为实际上new关键字将对象分配在堆内存。
关于局部变量里的函数:
在C语言中在函数里面定义的局部变量确实会在函数结束之后被释放掉,
例如:
void print()
{int a=0;
printf("%d",a);}
当函数调用完之后a所占用的内存控件就被释放掉了,实际上局部变量的存储空间都是放在栈上面的,当函数返回之后,关于此函数的栈数据都被弹出,函数内部的局部变量占用的内存空间也被释放。但是你通过malloc函数分配的内存空间并不是在栈上,而是在另一个特殊的区域,也就是堆,堆中分配的内存是不能自动被释放的,必须要程序员手动释放,在c中提供了free函数对malloc分配的内存空间进行释放,如果不释放就会造成内存泄漏。
不知道有没有面向对象语言的基础,例如C#,Java,C++。在C#和Java中都提供了一种叫垃圾回收器的机制,可以自动回收堆内存,而不需要程序员手动释放,这给了程序员极大的方便,也极大的避免了C和C++中的内存泄漏的问题。在C++中对象的创建如果是通过new关键字来创建的,那么对象使用完成之后必须通过delete关键字进行释放内存控件。因为实际上new关键字将对象分配在堆内存。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里有两个概念:指针变量本身;它所指向的内存区域。
函数退出后,指针变量本身(4个字节,一般在栈上)会被释放,但它所指向的内存区域不会被释放。
楼主的例子里,如果在method()里不释放b指向的空间,那么当method()退出时,b指向的空间不会被自动释放,而b这个指针变量不再存在了。这样一来b指向的空间就永远地泄漏了,因为再也没有指针指向它,你永远找不到它了。
如果出于某种原因不想在method里释放这块空间,可以在method()里把b的值赋给一个全局指针变量,以后再释放这个全局变量。
函数退出后,指针变量本身(4个字节,一般在栈上)会被释放,但它所指向的内存区域不会被释放。
楼主的例子里,如果在method()里不释放b指向的空间,那么当method()退出时,b指向的空间不会被自动释放,而b这个指针变量不再存在了。这样一来b指向的空间就永远地泄漏了,因为再也没有指针指向它,你永远找不到它了。
如果出于某种原因不想在method里释放这块空间,可以在method()里把b的值赋给一个全局指针变量,以后再释放这个全局变量。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |