C++函数执行完后内存释放问题
C++在执行函数的时候会先给函数体开辟一段内存来存贮函数的操作,还会为函数的变量开辟内存,最后返回函数结果。那么函数执行完了,函数体,函数变量(不考虑指针,都认为是实参副...
C++在执行函数的时候会先给函数体开辟一段内存来存贮函数的操作,还会为函数的变量开辟内存,最后返回函数结果。
那么函数执行完了,函数体,函数变量(不考虑指针,都认为是实参副本的内存都会释放吗?返回的函数值内存会释放吗?
计算机新手,有点困惑这个问题。 展开
那么函数执行完了,函数体,函数变量(不考虑指针,都认为是实参副本的内存都会释放吗?返回的函数值内存会释放吗?
计算机新手,有点困惑这个问题。 展开
展开全部
你能考虑到内存问题已经很不错了,不过C/C++指针以及内存管理问题一直都是新手迷茫的问题。
对于你的问题,我简单说几点吧:
1)在C/C++中内存有堆、栈之分(当然还有其他的,具体可以参考数据结构一类的书)。
2)堆是用户管理的,C中一般用malloc()和free()管理,C++用new 和delete管理,而栈是计算机管理的不需要用户干预,但栈的大小有限,特别是嵌入式系统,在函数调用时,对于大的结构体一般传指针(32位系统固定4个字节,其他系统等于AB(地址总线的宽度),参考微机原理一类的书),因为函数传参时,对于std_call,也需要压栈,大的结构体变量会使内存耗完,设备立马会死翘翘,而该类故障没用语法错误,很难排查,一旦交付到用户手里,出了问题就麻烦了。
3)对于一个函数不会给函数体开辟一段内存,函数原代码被编译器翻译成二进制后是放在代码段(CS段,可参考微机原理一类书籍),然后每一个函数会有一个入口地址,函数调用时会寻找这个地址,然后转到这个地址执行函数内部代码,当然调用的地址也会保持,以便返回,这叫函数调用时上下文(context),中断也有类似的过程(可参考微机原理一类的书籍)。
4)函数内部的变量我们叫局部变量(local variable),如:
int foo(void)
{
int test = 0;// Local variable.
int *ptr = (int*) malloc(sizeof(int));// for C/C++ languange,
objiect *o_ptr = new objiect();// for C++ only
}
test变量为局部变量,函数执行时分配内存,分配到栈上,函数执行完释放,ptr 和o_ptr 自己所占有的空间,同test变量,但是二者指向的空间被分配到了堆上,该函数被执行完后不会被释放,而会造成内存泄露。
对于你的问题,我简单说几点吧:
1)在C/C++中内存有堆、栈之分(当然还有其他的,具体可以参考数据结构一类的书)。
2)堆是用户管理的,C中一般用malloc()和free()管理,C++用new 和delete管理,而栈是计算机管理的不需要用户干预,但栈的大小有限,特别是嵌入式系统,在函数调用时,对于大的结构体一般传指针(32位系统固定4个字节,其他系统等于AB(地址总线的宽度),参考微机原理一类的书),因为函数传参时,对于std_call,也需要压栈,大的结构体变量会使内存耗完,设备立马会死翘翘,而该类故障没用语法错误,很难排查,一旦交付到用户手里,出了问题就麻烦了。
3)对于一个函数不会给函数体开辟一段内存,函数原代码被编译器翻译成二进制后是放在代码段(CS段,可参考微机原理一类书籍),然后每一个函数会有一个入口地址,函数调用时会寻找这个地址,然后转到这个地址执行函数内部代码,当然调用的地址也会保持,以便返回,这叫函数调用时上下文(context),中断也有类似的过程(可参考微机原理一类的书籍)。
4)函数内部的变量我们叫局部变量(local variable),如:
int foo(void)
{
int test = 0;// Local variable.
int *ptr = (int*) malloc(sizeof(int));// for C/C++ languange,
objiect *o_ptr = new objiect();// for C++ only
}
test变量为局部变量,函数执行时分配内存,分配到栈上,函数执行完释放,ptr 和o_ptr 自己所占有的空间,同test变量,但是二者指向的空间被分配到了堆上,该函数被执行完后不会被释放,而会造成内存泄露。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
执行完后函数的变量会释放,函数体(也就是函数代码)不会释放,一直在代码段中,以后要调用的时候还可以进行调用。返回的函数值会放在你定义好的变量中,如果你没有接收返回值,那么该返回值会被丢弃
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C++存储分为代码区、变量区;
代码区,就是所说的函数体,是不释放的。
函数的局部变量一般随着函数的返回,就释放了。
代码区,就是所说的函数体,是不释放的。
函数的局部变量一般随着函数的返回,就释放了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
循环调用,函数体内存也会无限叠加。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询