比如:
A类为
type
   TAClass = class(TObject)
   
   private
    
   public
     BSubObj: TBClass;  .............
//以上为类定义var AObj: TAClass;
    BObj: TAClass;
Begin
    AObj := TAClass.Create;
    BObj := TBClass.Create;
    AObj.BSubObj := BObj;
    AObj.free;  //请问在AObj.free之前是否还需要调用AObj.BSubObj.free来释放对象的内存空间?如何查看BSubObj和BObj所占内存空间的位置和大小?
    BObj.free;end;

解决方案 »

  1.   

    你在AClass的构造函数里需要create那个BSubObj的呀。
    所以,在AClass的析构函数里也需要freeBSubObj的。
      

  2.   

    调用free和destory;来释放内存哪一个更好?
      

  3.   

     //请问在AObj.free之前是否还需要调用AObj.BSubObj.free来释放对象的内存空间?如何查看BSubObj和BObj所占内存空间的位置和大小? 
     Re:   不需要,如果你释放了,就不需要以下代码
        BObj.free; 否则,会有访问违例错看大小用 sizeof(TClassA);
    看地址用 @BObj, 或Addr(BObj);楼上都是**啊,竟然说要释放。
      

  4.   

    当然不用,BSubOjb只不过是对象的一个指针而已,你又不是在AObj内部创建的BSubObj对象。当你使用:
      AObj.BSubObj := BObj; 
    只是将BObj的对象指针赋给BSubObj。也就是说,现在AObj.BSubObj和BObj指向了同一个对象。  这样想就清楚了吧?
      

  5.   

    这并不复杂,我前面说了:“一般情况下,按谁建立谁释放的原则办事准错不了”,在你的BObj类TAClass中并没有建立其成员BSubObj,只是引用了BObj,所以没必要在类中释放,而由建立BObj的过程释放。
      

  6.   

    有必要释放。
    BSubObj其实是一个指针,指向类的实例,调试的时候你可以看到。
      

  7.   

    原则是谁建立谁释放
    你上面没错, b 不是 a 建立的, a依赖b, 所以先 a.free, 再 b.free是正确的Integer(a.BSubObj) 取出来的就是位置, sizeof(TB 或 a.BSubObj) 取大小, 实际占内存会大一点点