不知道是否理解正确,还请高手多加指点,这是我今天再修改程序的时候碰到的一些问题,在我修改的软件当中正是通过类似Sum函 数的指针返回值,程序编译没有错误,在我反复试验软件的功能时候出现了指针错误,后来修改了函数,让其不通过指针返回值,这才得以不出现指针错误,但在内 存溢出检测过程中,发现软件当中的内存溢出问题还是很严重,我把其归结为整个软件设计时,由于大量使用指针,导致指针混乱,出现不少野指针。
假如有如下函数:
int* Sum(int x)
{
int* s=new int[1];
int i=x;
int sum=0;
if (sum<=x)
{
sum+=1;
}
s[ ]=∑
return s;
}
单从这一个函数来说,它是内存溢出的,
首先,s为一指针,这是个栈内存变量(stack),但是它所指的内存为堆内存空间(heap),因为是以new来申请的。当函数返回一个数和的时候,也即函数运行结束的时候,栈内存变量s被系统收回,而s所申请的堆内存空间却没有被释放,因此产生了内存溢出。
但是很多时候,我们是要调用这样一个类似的函数,这个时候,其内存是否溢出,则要看具体调用的情况。例如:
假设一个变量 int* isum;
isum=NULL;
isum=Sum(100);
………………
……………
……………..
delete [] isum;
isum=NULL;
则不属于内存溢出,因为isum为一指针,当其调用函数Sum时,其指向的是在Sum函数中申请了但没有被释放的堆内存,而在函数外面,其被isum指针所释放。
若:
int* isum=new int[2];
isum=Sum(100);
………………
……………
……………..
delete [] isum;
isum=NULL;
还是会内存溢出的,我是这样理解的,因为开始时isum已经申请了一片堆内存空间,即isum已经指向了函数Sum外部的那个堆空间,当调用函数的时候,isum指针立即指向了函数内部申请的堆空间,因此最后指针isum所释放的是函数Sum内部申请的堆空间,而其在函数外部申请的堆空间没有被释放,同样产生了内存溢出。
关于内存溢出的问题,我觉得,只要不出现软件运行时的错误就没有大问题,前提是:
1. 软件运行时间不长。
在软件结束的时候,操作系统会自动地收回那些没有被释放的堆内存空间。
2. 硬盘空间足够大。
因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替[1]
参考文献:
[1]林锐 《高质量C++/C编程指南》
[2]网络文章 <heap和stack的区别>