析构函数有没有正常析构对象呢,那个create函数好像没什么用吧
protected
  constructor CreateInstance;     //Constructor
  class function AccessInstance(Request: Integer): TToolManager;  
public
  procedure Create;               //??????????????
  destructor Destroy; override;   //??????????????
  class function Instance: TToolManager;constructor TToolManager.CreateInstance;
begin
  inherited Create;
  FActiveTool := nil;           //成员变量
  Tools := TList.Create;        //成员变量
end;class function TToolManager.AccessInstance(Request: Integer): TToolManager;
{$WRITEABLECONST ON}
const FInstance: TToolManager = nil;
{$WRITEABLECONST OFF}
begin
  case Request of
    0: ;                                 //返回FInstance
    1: if not Assigned(FInstance) then FInstance := CreateInstance;   //返回非nil FInstance
    2: FInstance := nil;                 //返回nil
  else
    raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
  end;
  Result := FInstance;
end;procedure TToolManager.Create;
begin
  inherited Create;
  raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]); //抛出异常?????
end;destructor TToolManager.Destroy;
var
  i : Integer;
begin
  if AccessInstance(0) = Self then AccessInstance(2);                     //这句算什么?????
  for i := 0 to Tools.Count - 1 do
    TAbstractTool(Tools.Items[i]).Free;
  Tools.Free;
  inherited Destroy;
end;class function TToolManager.Instance: TToolManager;
begin
  Result := AccessInstance(1);                                            //这句应该是返回对象
end;

解决方案 »

  1.   

    落了一个函数
    public
      class procedure ReleaseInstance;class procedure TToolManager.ReleaseInstance;
    begin
      AccessInstance(0).Free;
    end;还有,程序结束的时候我调用了ToolManager.Free;在析构函数那儿设断点,怎么没跳进去
      

  2.   

    第一反应是Singleton模式。不过这段代码很奇怪,而且有些写法是错误的。那个Create函数只是为了告诉Client要使用Instance来获取唯一的实例。“if AccessInstance(0) = Self then AccessInstance(2);”的作用实际上是将TToolManager.AccessInstance里面的FInstance“常量”置为nil。ReleaseInstance实际上是释放活动实例(但没有将FInstance置为nil)建议还是多看看其他的实现代码...
      

  3.   

    我看着头疼...我去看看你说的singleton模式
      

  4.   

    我看了一下,是singleton模式,完全一样的实现模式http://www.7880.com/Info/Article-18519600.html
    前面构造的清楚了,还是不明白析构的时候为什么一定要用ReleaseInstance,而不能.free,还请指教一下哈
      

  5.   

     這段代碼有太多問題了
     Procedure create ;   <> destructor create ;   // 所翠這個函數不是函造函數; 當然人家這樣寫,我們也不能說他錯。但至少實全實現的代碼應該原意不是通過這個片斷能解釋的。
      

  6.   

    目的应该是该类只能生成唯一一个对象
    我也觉得procedure create 应该改成constructor,虽然实际上关系不大