如果在过程或函数中创建了对象或申请了指针内存,在过程或函数中被外部的控件属性引用了。这时候应该如何释放内存?如:
procedure test;
var
  a : TA;//TA为类
  b : ^R;//R为record类型
begin
  a := TA.Create;
  控件1.属性 := a;
  New(b);
  控件2.属性 := b;
end;a和b被外部的控件属性引用了,这种情况应该如何释放a,b的内存?

解决方案 »

  1.   

    可以随控件1和控件2的释放而释放,或者当你确认属性不再使用的时候进行释放.
    Object:a.free,PRecord:Dispose(b)
      

  2.   

    .
    同意樓上的。因為在過程內創健的話,將變得不太容易管理。。 當然也可翠使用合局的TLIST來管理過程中對象的內郹分配
      

  3.   

    你这样用是不对的。a,b是在栈中分配的,除了子程序,a,b将不存在,为a,b分配的内存将无法引用。造成内存泄露。
      

  4.   

    这种情况应该无可避免的吧。例如在一个按钮事件里动态创建一个对象实例或记录等,是经常用到的。又例如TreeView的Node经常动态创建。
      

  5.   

    嗯,如果a,b指向堆中的对象有被其他引用的话,a,b变量本身的内存释放了也没关系了吧
      

  6.   

    ab指向的堆中内存在ab被释放后,不知道是否可以释放,我感觉不能。
      

  7.   

    Pointer和TObject类型都是堆管理,原子变量:byte int等等才是栈管理
      

  8.   

    这样子使用并不会存在问题,关键在于“控件1”和“控件2”当中需要对“属性”进行管理,一般是这样子:...
    private
      FRefObject: TObject;
    ...
    public
      property RefObject: TObject read FRefObject write FRefObject;
    ...
    如此由于外部并不能管理到RefObject的生命周期,所以最好的办法是在Create当中先赋值为Nil,然后在Destroy当中,判断:
    if FRefObject <> Nil then FRefObject.Free;
      

  9.   

    僵哥所说不错,property更直观,直接变量也并无不可以,Create中赋值为Nil,Destroy中释放的时候判断是否有对象实例存在.