procedure TForm1.Button20Click(Sender: TObject);
begin
    flag := '*' ;
    StackFlag.Push(TObject(flag));
    StackNum.Push(TObject(valueOne));
end;
上面那段代码有点问题! 我该怎么改! FLAG是string型的,StackFlag是TObjectStack类型的;而Push里要传的参数是TObject类型的,我试过强制转化,但是不行! 所以求教CSDN的各位大神指教!~

解决方案 »

  1.   

    flag 不长的话,可以定义成 ShortString
    长的话,可以用 Array of Char;
      

  2.   

    type
      TMyString = class
        S: string;
      end;procedure TForm1.Button20Click(Sender: TObject);
    var
      flag: TMyString;
    begin
      flag := TMyString.Create;
      flag.S := '*';
      StackFlag.Push(flag);
    end;ps: 最后要注意遍历StackFlag释放flag
      

  3.   


    2楼说的确实是个方法。
    Delphi中的字符串类型用起来虽然方便,但其实Delphi在后台做了很多事情的,例如,为了提高程序的性能,Delphi在字符串上面实现了“引用计数”功能,当引用计数为0,就会将字符串所占用的空间释放掉,楼主代码中,只有flag的复制会产生引用计数,后面Push函数的调用由于丢失了类型信息,因此,不会产生引用计数,当函数调用结束时,flag释放,对应字符串的引用计数减1后变为0,因此就释放掉了,后续再对StackFlag中的数据进行引用,就会导致野指针
      

  4.   

    function StrBufSize(const Str: PChar): Cardinal;
    var
      P: PChar;
    begin
      P := Str;
      Dec(P, SizeOf(Cardinal));
      Result := Cardinal(Pointer(P)^) - SizeOf(Cardinal);
    end;
    你看一下这个系统函数吧,计算长度。
      

  5.   

    今天试了下上面的代码,怎么TMyString.create调不出来啊!
    还有近很多错误啊! 怎么用啊!
      

  6.   

    这个代码今天试了一下怎么TMyString.create调不出来啊!!
      

  7.   

    还木有啊! 不会用啊! 大哥你知道怎么用吗? 发个源代码给我好不! [email protected]
      

  8.   

    FLAG是string型的
    你将这个
    flag:pchar;
    试试吧
      

  9.   

    本帖最后由 zhaixiaohu 于 2012-04-24 13:20:46 编辑