在delphi里用FreeMem(pointer),或Dispose(pointer)释放内存后
无法判断指针pointer是否被释放,需要手动设置pointer=nil.怎么能不
设置pointer=nil还进行判断.
   简单点说:怎么样用     
             if pointer = <已经被释放,或从来未申请内存> then 
                 FreeMem(pointer);
   句式解决这个问题.

解决方案 »

  1.   

    对不起着急写错了:             if pointer <> [已经被释放,或从来未申请内存] then 
                     FreeMem(pointer);
      

  2.   

    我知道用什么了反正也没人答我的问题.
    assigned(pointer).
    OK!!!!
      

  3.   

    if Assigned(pointer) then
      FreeAndNil(pointer)
    比较保险
      

  4.   

    在一期 borland的專版上看過討論, 但也沒出個所以然, 最後, 還是用個 try except來解決!
      

  5.   

    Assigned(a)函数
    和 a=nil是完全相同的
      

  6.   

    if Assigned(pointer) then
      FreeAndNil(pointer)
    一点都不保险
      

  7.   

    好像沒有一個函數能做到!!

    var
      p : pointer ;
    begin
      p := pointer(2);
      // 此時P為無效指針, 誰能判斷?
      caption := inttostr(Pinteger(P)^);
    end;
      

  8.   

    Assigned(a)和 a = nil 是不同的.Assigned ----是已经分配的意思, 而nil是一个空指针.
    判断时应该这样写,上面我写的简单了.             if not assigned(pointer) then 
                     FreeMem(pointer);
    不能用 a= nil 原因:
    如下:
      1>:一定出异常
      var 
        pointer:TPointer;
      begin
        if pointer <> nil then
           FreeMem(pointer);
      end;用assigned不会出错:
      var 
        pointer:TPointer;
      begin
        if not assigned(pointer) then
           FreeMem(pointer);
      end;这回你们再试,一定保险,不保险你再来找我吧.我也是才试出来的.
      

  9.   

    上面Hewin(hewin)写的代码这样写就不会异常了.var
      p : pointer ;
    begin
      p := pointer(2);
      // 此時P為無效指針, 誰能判斷?
      if not assigned(p) then
        caption := inttostr(Pinteger(P)^);
    end;
      

  10.   

    faibo(xinliang) 你會不會用if 語句
      

  11.   

    看看Delphi的help吧Assigned returns false if P is nil, true otherwise.Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.
      

  12.   

    楼上兄弟, 你的帮助没错,但谁说P is nil.
    还有你列出的好像不全这只是其中一种情况而以,
    我还不会笨到不看帮助就去询问别人的.
    空指针和未分配是两回事,我的代码中P不等于nil."我未进行初始化"!!!!!
    请你做过测试用例看看我说的对不对,
    我列出来的是测试过的代码.还有如果P is nil, 我连续Dispose(P)或FreeMem(P) 100次也不会出错,还用判断他做甚???dqzhz(多情种子) 这位人兄,你说的太对了.
    1:如果我写错了,程序应该调不通吧.
    2:我写了一年多了都是这么写的。
    3:如果真的错了,请您指点一二。
    4:这种问题不值得在这里讨论。不讲了,只是希望大家都多多学习,天天进步,都成为一代编程高手。
    说错了请多批评,大家互相探讨。
      

  13.   

    唯一的办法就是在声明指针和释放指针时将指针置nil。
    然后用指针是否等于nil判断。好像没有其他方法了。
    我真看不懂faibo(xinliang)在说啥
      

  14.   

    这个问题没有一个很好的解决方法,如果同一个内存块只有一个指针指向它那么在释放内存块后马上把改指针设置为nil,以后就可以根据是否空指针判断是否已释放,如果多个指针指向同一个内存块一个指针释放后其它指针指向这个内存块就无效了,但并不为nil,还是无法确定是否已释放
      

  15.   

    本來不想多說,本著共同進步的原則:說說上面這行代馬:
    ===============
        if not assigned(pointer) then
            FreeMem(pointer);
    ================  如果要運行 FreeMem(pointer)這一行,必須pointer=nil;
      也就是FreeMem(pointer)永遠沒傚上面有位老兄說他的代碼從來沒出錯,確實沒錯,只是你聲明的所有變量都沒釋放而已。
      

  16.   

    请见我以前的帖子http://expert.csdn.net/Expert/topic/1903/1903152.xml?temp=.2238733
      

  17.   

    这个问题,我两年前也问过了,最后没有什么结果。
    只要我们在释放一个对象的时候,要记住把其指针也同时赋值为nil
      

  18.   

    我的理解是Freemem(pointer)之后,
    pointer指针指向的那块内存已经被回收了;
    但是pointer指针本身也是将一个地址值保存在内存的另外一个地址上;
    这个地址如果在栈上就在过程完毕后自动释放掉了,不需要你做什么pointer=nil只类的;
    如果是在堆里,你要将这个指针的值,也就是被你释放的对象原来的地址设置为空;
    否则可能你的那块内存可能已经存放了其他的东西并且和你的指针定义的类型完全不一样,而你再用这个指针的时候;可能回引起错误的操作
      

  19.   

    你的指针的值其实可以找到的;
    也就是指针指向的数据的内存的地址;
    然后你freemem之后
    然后在copymemory那么大的内存
    看看里面的内容,是已经被释放的
      

  20.   

    呵呵,faibo (xinliang) 根本没有把原理弄明白~~
        这么说吧:系统在GetMem 的时候做的是什么呢?首先是系统在堆里开辟一段内存,然后把这段内存的首地址放到指针里面。指针其实就是一个32位的内存单元。
        那么,FreeMem 呢?它就直接把指针所指向的那段内存释放掉了。注意:这个过程并不承诺帮你把指针清零,也就是说它确实还指向一个地址,那个地址是存在的,尽管那个空间已经被释放掉了。所以Assigned(p)事实上返回的还是True。楼主理解Assigned 是分配的意思,其实是不对的。Assigned 是指派的意思,就是说指针是不是确实指向了一个地址。所以Assigned(p)其实和(p=nil) 是一个意思。所以,请注意:假如你希望Assigned(p) 有效的话,必须保证p 在不指向一个有效地址的时候一定被赋为nil。比如FreeMem(p); 之后一定要跟一个p := nil;
        顺便说一下,在函数的结尾假如FreeMem(p);之后马上跟一个p := nil;,常常会导致一个编译器警告,说是对变量赋值但是没有使用,所以后来的Delphi 里面就提供了一个FreeAndNil()的procedure,以便避免这样的警告。所以,推荐大家使用在释放内存的时候使用这个procedure。