我自定义了一个类型,其中有很多对象,当我要完全释放这个自定义类型的时候要一个个对其中所有对象使用Free方法,很麻烦不知道用ZeroMemory是不是可以安全的释放所有对象呢?

解决方案 »

  1.   

    PRECMGR = ^TRECMGR;
    TRECMGR = record
       field1,
       field2,
       ...
       fieldn:tobject;   freeAll:procedure(P:PRecMgr);
    end;procedure freeAllRes(P:PRecMgr);
    ...var
      RM:TRecMGR = (field1:=tboject.create;...fieldn:=tobject.create; freeall:freeAllRes);//释放的时候调用类型自身的函数
      RM.freeAll(@RM); 
      

  2.   


    PCustomType=^TCustomType
    TCustomType=record
      A:TA;
      B:TB
    end;procedure Test;
    begin
      New(PCustomType); 
      try
        A:=TA.Create;
      finally
        A.Free;
      end;
      Dispose(PCustomType)
    end;
      

  3.   


    除非你把變量和分配在堆上的實例都ZERO掉,不過不實際。
      

  4.   

    刚发现自己写错了~
    PCustomType.A:=TA.Create;
      

  5.   


    你ZeroMemory你的类型中所有对象大小的字节是很危险的,Zero你的引用变量更危险。
    正如2楼说的,你建一个过程专门释放你的类型,然后,以后只要把你的类型的变量传给该过程就行了啊,多方便。
    如,
    procedure FreeMyType(var MyType);
    begin
      MyType.f1.Free;
      MyType.f2.Free;
      MyType.f3.Free;
      ...
      MyType.fn.Free;
    end;
    ///////////////////////////////////////////var
      mt: TMyType;
    ...
    begin
      ...
      FreeMyType(mt);
      ...
    end;
      

  6.   

    汗!原型没写好
    procedure FreeMyType(var MyType); 
    应为,
    procedure FreeMyType(var MyType: TMyType);
    抱歉,抱歉。