我的程序大概是这样的: 
struct snode 

...... 
}; 
void main() 

struct snode *p; 
//下面有个循环,循环申请空间和相应的操作 
//循环开始 
son1(p); 
son2(p); 
//循环完毕 

void son1(snode*& p ) 

//在此函数中用new snode,申请空间然后赋给p 
//用于存放数据,数据很大,所以申请了较大的空间 

void son2(snode*& p) 

//在此函数中delete p 
//p=NULL; 

程序大体是这样子的,这里写的不是很完整,而且我用的是Mfc 
按我的理解,原来的申请的空间是释放了,但是在debug时用CTRL+ALT+DEL查看时,发现内存还没有释放,所以执行下面的数据就出现了内存不足? 
我的数据是存放链中的,所以delete是也是按链的方式删除释放内存的 有人遇到这问题吗?
在此特请教各位大侠,帮帮小妹,不胜感激!多谢! 

解决方案 »

  1.   

    delete []p;  //new []方式,和这种方式匹配.
      

  2.   

    CTRL+ALT+DEL查看的是进程占用的物理内存,程序中分配的虚拟内存,只有在使用时才会交换到物理内存中,两者的关系不大。按你描述的做法是没有问题的,如果内存不足,应该另有原因。你分配的内存有多大?如果是大块内存(几百MB以上),最好是在程序初始化的时候分配,不要释放。
      

  3.   

    程序框架你是描述出来了,但是涉及到内存泄漏这类问题,往往是一些细节问题,可能隐藏的比较深。一般来说,如果你确认你已经编写了删除代码,那么请调试确认你的删除代码已经成功被执行到。
    你在调试版本下,就当前这代码,运行后关闭系统,在debug窗口中查看是否有内存泄漏报告。
      

  4.   

    用这种方式传递的指针指向的内存可以被释放吗?
    void son2(snode*& p) 
    *运算符和&运算符优先级相同,并且符合右结合规则,那么,snode*&p=node 这样的赋值表达式应该怎么理解好呢?在这种情况下,delete p又是什么效果呢?
    我也糊涂了……
    安全起见,楼主试着改成下面这样看看:
    void son2(snode* p) 
      

  5.   

    有个问题我的程序是在MFC的DOC类中的,所以我在DOC类中设了一个全局的单链表这个单链表,用new申请的结点空间,我没有删,因为程序退出前这些变量都要用到,而且按我的理解只要DOC没有关闭它的生存周期就没有结束,这个也会导致内存泄露吗?按照我的理解,内存泄露就是那些没用的变量占了空间,导致有用的变量没空间用
    只有那些生存周期到了但空间没有释放的变量才会到导致内存泄露请问我的理解正确吗?
      

  6.   

    这个单链表,用new申请的结点空间,我没有删,因为程序退出前这些变量都要用到,而且按我的理解只要DOC没有关闭它的生存周期就没有结束,这个也会导致内存泄露吗? 
    ==这个不会。按照我的理解,内存泄露就是那些没用的变量占了空间,导致有用的变量没空间用 
    只有那些生存周期到了但空间没有释放的变量才会到导致内存泄露 请问我的理解正确吗?
    ==正确吧
      

  7.   

    我用boundcheck查了,但是程序运行的特慢,不知怎么回事
      

  8.   

    http://blog.csdn.net/qiqi5521/archive/2008/03/06/2154074.aspx
      

  9.   

    void son1(snode*& p )是链表吗?如果是,就要保证delete干净了,呵呵!
      

  10.   

    先感谢qiqi5521!
    我在他的博客中,看到说内存越界,我在一个小的DOC类的成员方法中申请了空间给doc类的成员,但这个空间首先是赋给局部变量的,请问这是算不算内存越界?
    我的理解是:
        从定义上将这应该算是内存越界,但是vc检查不出来,只要我把申请的空间记住了(赋给了全局变量),没有丢失,最终没忘释放,我想,这应该还是可以的,不会导致内存泄露的   我的理解正确吗?