PFuncInfo=^TFuncInfo
TFuncInfo=record
 DispName: string;
 Level: Integer;
end;
var
  mFuncList: TStringList;//全局变量
  
代码大概如下:
procedure Init;
var  
  FuncInfo: PFuncInfo;
  i: Integer;
begin  
  for i := 0 to sTempList.Count - 1 do
  begin
    New(FuncInfo);
    with FuncInfo^ do
    begin
      DispName := sTempList.Strings[i];
      Level := i;
      mFuncList.AddObject(DispName, TObject(@FuncInfo));
    end;    
  end;
end;  
  
  
  然后我在释放的时候如下:
procedure FreeFuncInfo;
var
  i: Integer;
  FuncInfo: PFuncInfo;
begin
  if mFuncList <> nil then
  begin
    for i := 0 to mFuncList.Count - 1 do
    begin
      FuncInfo := PFuncInfo(mFuncList.Objects[i]);
      if FuncInfo <> nil then
        Dispose(FuncInfo);//此行出错,请教原因
    end;
  end;
end;  以上到底是怎么错了呢?谢谢!

解决方案 »

  1.   

    释放的时候倒着删
    for i := mFuncList.Count - 1 downto 0 do 
      

  2.   

    我只是释放mFuncLIst里面Object的指针,并没有删除mFuncList的某个项,需要倒着删吗?
      

  3.   

    在我机器上执行没有问题,可能是你的mFuncList是用来Add,方法,建议在使用之前清空
    mFuncList.Clear
      

  4.   

    //此处不解;
    mFuncList.AddObject(DispName,   TObject(@FuncInfo));procedure   FreeFuncInfo; 
    var 
        i:   Integer; 
        FuncInfo:   PFuncInfo; 
    begin 
        if   mFuncList   <>   nil   then 
        begin 
            for   i := 0 to    mFuncList.count-1     do 
            begin 
              if Assigned(PFuncInfo(mFuncList.Objects[i]) then begin
                    Dispose(PFuncInfo(mFuncList.Objects[i]); 
            end; 
        end; 
    end;     
      

  5.   

    //此处不解; 
    mFuncList.AddObject(DispName, TObject(@FuncInfo)); 仅仅是为了存放一个记录类型的指针
    方便以后调用这样写有问题吗?
      

  6.   

    不好意思,贴错了。没问题。你照JWPL190的方法将TSTRINGLIST CLEAR一下看一下。
      

  7.   

    mFuncList.AddObject(DispName,   TObject(@FuncInfo)); 
    >>
    mFuncList.AddObject(DispName,   TObject(FuncInfo)); 
    已经是指针了,不要再取地址
    mFuncList.AddObject(DispName,   TObject(@FuncInfo)); 
    增加的是一个指向指针的指针,对应的释放方法是
    PFuncInfo(Pointer(mFuncList.Objects[i])^);
      

  8.   

    问题解决了:
    直接用:
    mFuncList.AddObject(DispName, TObject(FuncInfo));   
    释放的时候:
    FuncInfo := PFuncInfo(mFuncList.Objects[i]);
    if FuncInfo <> nil then
    begin
      Dispose(FuncInfo);
    end;但是用
    mFuncList.AddObject(DispName, TObject(@FuncInfo));   
    释放的时候用
    FuncInfo := PFuncInfo(Pointer(mFuncList.Objects[i])^);
    Dispose(FuncInfo);
    还是会报错啊,请教ysai或者其他朋友这是怎么解释呢?谢谢!
      

  9.   

    你定义的FuncInfo本身就已经是个指针了,再用取地址符号进行运算,你添加到mFuncList中的就是指针的指针了。