• 全部
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

TInterfaceObject的引用计数的问题

babyboy 2005-08-05 06:32:44
ITest = Interface
['{4979F659-C4BA-4F01-B09F-A4E7AA5022F1}']
procedure Excute;
end;

TTest = (TInterfaceObject, ITest)
private
ID: integer;
public
Excute;
end;

var
tt:TTest;
procedure Create;
begin
if not assigned(tt) then tt := TTest.Create; //此时tt的引用计数怎么还是0?
Insert(tt); //tt的引用计数变为1
Remove(tt); //tt的引用计数变为0,被释放了
tt.Execute; //访问非法地址
end;



procedure Insert(aItest: ITest);
begin
FList.Insert(aItest); //FList是TInterfaceList;
end;

procedure Remove(aItest:ITest);
begin
FList.Remove(aItest);
end;

为什么tt被创建以后引用计数还是0?
...全文
55 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
swayi21 2005-08-07
_AddRef
_Release

或者自己实现IUnknown接口的这两个函数,
直接 Result := -1;不实现计数也可以。
回复
swayi21 2005-08-07
halfdream(哈欠) 正解

既然你的类实现了接口,就不要调用类来创建实例,
回复
halfdream 2005-08-06
才创建的时候,没有INTERFACE变量引用它,这时候当然引用计数为0.
tt := TTest.Create;注意,这儿的tt类型是TTest而不是ITest!

当调用时候,
Insert(tt); //这时候才开始引用..
回复
cdsgajxlp 2005-08-05
TTest = (TInterfaceObject, ITest)
private
ID: integer;
FRefCount: integer;
public
Function _AddRef : integer;Stdcall;
Function _Release : integer;Virtual;StdCall;
Excute;
end;

Function TTest._AddRef : Integer;
begin
Result:=InterLockedDerement(FRefCount)
end;

Function TTest._Release : integer;
begin
Result:=InterLockedDecrement(FRefCount);
end;


回复
相关推荐
发帖
Delphi
创建于2007-08-02

4876

社区成员

Delphi 开发及应用
申请成为版主
帖子事件
创建了帖子
2005-08-05 06:32
社区公告
暂无公告