关于内存溢出的一些问题

 
    不知道是否理解正确,还请高手多加指点,这是我今天再修改程序的时候碰到的一些问题,在我修改的软件当中正是通过类似
Sum函 数的指针返回值,程序编译没有错误,在我反复试验软件的功能时候出现了指针错误,后来修改了函数,让其不通过指针返回值,这才得以不出现指针错误,但在内 存溢出检测过程中,发现软件当中的内存溢出问题还是很严重,我把其归结为整个软件设计时,由于大量使用指针,导致指针混乱,出现不少野指针。

         假如有如下函数:

                                          int* Sum(int x)

                                               {

                                                      int* s=new int[1];

                                                     int i=x;

                                                    int sum=0;

                                                    if (sum<=x)

                                                     {

                                                           sum+=1;

                                                    }

                                                     s[ ]=&sum;

                                                 return s;

                                           }

   单从这一个函数来说,它是内存溢出的,

   首先,s为一指针,这是个栈内存变量(stack),但是它所指的内存为堆内存空间(heap),因为是以new来申请的。当函数返回一个数和的时候,也即函数运行结束的时候,栈内存变量s被系统收回,而s所申请的堆内存空间却没有被释放,因此产生了内存溢出。

 

但是很多时候,我们是要调用这样一个类似的函数,这个时候,其内存是否溢出,则要看具体调用的情况。例如:

 

                 假设一个变量 int* isum;

                                                                         isum=NULL;

                                                            isum=Sum(100);

                                                                ………………

             ……………

                ……………..

             delete [] isum

            isum=NULL

则不属于内存溢出,因为isum为一指针,当其调用函数Sum时,其指向的是在Sum函数中申请了但没有被释放的堆内存,而在函数外面,其被isum指针所释放。

 

      若: 

              int* isumnew 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的区别>
展开阅读全文

没有更多推荐了,返回首页