函数运行结束时,函数体中的变量是否被释放?

kewenliang
函数运行结束时,函数体中的变量是否被释放?

函数运行结束时,函数体中的变量是否被释放?
变量包括全局变量和局部变量

scutan
回复 #1 kewenliang 的帖子

局部变量会被释放, 全局变量不属于这个函数, 不存在是否被释放的说法.

cugb_cat
在函数中定义的变量会释放

net_robber
在补充一点吧,自己定义的变量,放在栈上,会被释放
malloc申请的内存空间,不在栈上,需要手动释放

veking
在函数内定义的变量是动态变量,当函数运行的时候,变量在栈上分配空间,然后使用,当函数运行结束时,系统只是收回该函数在栈上分配的空间,也就是变量被释放了,因为你无法在引用该变量了,但是变量中存储的内容是没有释放的,所以在函数内定义变量时要注意变量的初始化,防止垃圾数据影响函数的执行结果。

kewenliang
楼上几位说的都很好。
《c++ primer》上说:不要返回局部对象的引用。因为函数执行结束时会释放分配给局部对象的存储空间,此时对局部对象的引用会指向不确定的内存。举例如下:
[code]const string &manip(const string &s)
{
      string  ret = s;
      return  ret;
}[/code]
此例中的ret为局部变量。
但是下面的这个例子却可以正确返回引用
[code]const string &ShorterString(const string &s1, const string &s2)
{
          return  s1.size()<s2.size()?s1:s2;
}[/code]
此例中的引用形参是直接与实参相关联的,也就是实参的别名,但是当函数运行结束时,他们所占用的内存空间不也被释放吗?

net_robber
你是来提问呢,还是考试大家?

Godbach
[quote]原帖由 [i]net_robber[/i] 于 2008-6-30 10:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8700792&ptid=1184322][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
你是来提问呢,还是考试大家? [/quote]
:mrgreen: :mrgreen:

kewenliang
[quote]原帖由 [i]net_robber[/i] 于 2008-6-30 10:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8700792&ptid=1184322][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
你是来提问呢,还是考试大家? [/quote]
我是来提问的。因为我不懂。

jiangf
函数体内的局部变量是在栈空间上,一旦遇到了函数结束,与该函数对应的栈空间就被释放;
全局变量是定义在一个C/CPP文件中对应的栈空间,要等这段程序执行完毕才会被释放;

scutan
回复 #6 kewenliang 的帖子

因为是引用, 此时的变量存在周期并不是在这个函数中的.

kewenliang
[quote]原帖由 [i]jiangf[/i] 于 2008-6-30 10:40 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8700975&ptid=1184322][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
函数体内的局部变量是在栈空间上,一旦遇到了函数结束,与该函数对应的栈空间就被释放;
全局变量是定义在一个C/CPP文件中对应的栈空间,要等这段程序执行完毕才会被释放; [/quote]

明白了
谢谢各位

kewenliang
[quote]原帖由 [i]scutan[/i] 于 2008-6-30 10:42 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8700997&ptid=1184322][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
因为是引用, 此时的变量存在周期并不是在这个函数中的. [/quote]
明白了
谢谢。

77h2_eleven
[quote]原帖由 [i]kewenliang[/i] 于 2008-6-30 10:01 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8700581&ptid=1184322][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
楼上几位说的都很好。
《c++ primer》上说:不要返回局部对象的引用。因为函数执行结束时会释放分配给局部对象的存储空间,此时对局部对象的引用会指向不确定的内存。举例如下:
const string &manip(const s ... [/quote]
要看是指针变量还是普通变量