当前位置: 技术问答>linux和unix
请问return语句会执行哪些操作?在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
来源: 互联网 发布时间:2015-08-27
本文导语: 以下程序在unix环境下,居然没溢出! #include char * fn() { char * p; p = (char *)malloc(50000000); return p; } void main(int argc, char ** agrv) { char *ptr; long i = 0; while (1...
以下程序在unix环境下,居然没溢出!
#include
char * fn()
{
char * p;
p = (char *)malloc(50000000);
return p;
}
void main(int argc, char ** agrv)
{
char *ptr;
long i = 0;
while (1)
{
ptr = fn();
i++;
if (i>1000000000) i = 0;
printf("%dn",i);
}
}
#include
char * fn()
{
char * p;
p = (char *)malloc(50000000);
return p;
}
void main(int argc, char ** agrv)
{
char *ptr;
long i = 0;
while (1)
{
ptr = fn();
i++;
if (i>1000000000) i = 0;
printf("%dn",i);
}
}
|
之所以没有溢出,是因为你系统给你的内存是有一定限制的,你的主函数经过一定次数的调用fn()之后,fn()将申请不到内存而返回NULL,将主函数改成:
void main(int argc, char ** agrv)
{
char *ptr;
long i = 0;
while (1)
{
ptr = fn();
if (ptr == NULL)
break;
i++;
if (i>1000000000) i = 0;
printf("%dn",i);
}
}
不用多久,你的程序就会退出来了。
void main(int argc, char ** agrv)
{
char *ptr;
long i = 0;
while (1)
{
ptr = fn();
if (ptr == NULL)
break;
i++;
if (i>1000000000) i = 0;
printf("%dn",i);
}
}
不用多久,你的程序就会退出来了。
|
不会释放!!! 你这样就造成了分配的内存丢失, 也就是内存泄漏。
|
请问return语句会执行哪些操作?
1。把p的值放入某个寄存器中,如eax
2。把入栈时的压进堆栈的返回地址弹出到eip
在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
不会,内存泄露。
1。把p的值放入某个寄存器中,如eax
2。把入栈时的压进堆栈的返回地址弹出到eip
在函数中return一个已分配内存的指针,该指针所占用的内存会释放吗?
不会,内存泄露。
|
你没有在fn()中释放,但你一定要在使用完释放不然就会有内存泄漏.
|
到了N次以后fn的返回值就是NULL了
|
当然不会的了啦,地址的分配要靠free()来释放的!
|
回复人: datuhao(峡谷)
请问return语句会执行哪些操作?
1。把p的值放入某个寄存器中,如eax
2。把入栈时的压进堆栈的返回地址弹出到eip
------------------
1 仅在return 有参数时会把你的返回值传入eax
1.5。恢复现场
恢复保护的寄存器 特别是esp,ebp
pop ...
leave
2 返回调用者
ret
请问return语句会执行哪些操作?
1。把p的值放入某个寄存器中,如eax
2。把入栈时的压进堆栈的返回地址弹出到eip
------------------
1 仅在return 有参数时会把你的返回值传入eax
1.5。恢复现场
恢复保护的寄存器 特别是esp,ebp
pop ...
leave
2 返回调用者
ret