比如:
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;
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;
所以,在AClass的析构函数里也需要freeBSubObj的。
Re: 不需要,如果你释放了,就不需要以下代码
BObj.free; 否则,会有访问违例错看大小用 sizeof(TClassA);
看地址用 @BObj, 或Addr(BObj);楼上都是**啊,竟然说要释放。
AObj.BSubObj := BObj;
只是将BObj的对象指针赋给BSubObj。也就是说,现在AObj.BSubObj和BObj指向了同一个对象。 这样想就清楚了吧?
BSubObj其实是一个指针,指向类的实例,调试的时候你可以看到。
你上面没错, b 不是 a 建立的, a依赖b, 所以先 a.free, 再 b.free是正确的Integer(a.BSubObj) 取出来的就是位置, sizeof(TB 或 a.BSubObj) 取大小, 实际占内存会大一点点