procedure TForm1.Button20Click(Sender: TObject);
begin
flag := '*' ;
StackFlag.Push(TObject(flag));
StackNum.Push(TObject(valueOne));
end;
上面那段代码有点问题! 我该怎么改! FLAG是string型的,StackFlag是TObjectStack类型的;而Push里要传的参数是TObject类型的,我试过强制转化,但是不行! 所以求教CSDN的各位大神指教!~
长的话,可以用 Array of Char;
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
2楼说的确实是个方法。
Delphi中的字符串类型用起来虽然方便,但其实Delphi在后台做了很多事情的,例如,为了提高程序的性能,Delphi在字符串上面实现了“引用计数”功能,当引用计数为0,就会将字符串所占用的空间释放掉,楼主代码中,只有flag的复制会产生引用计数,后面Push函数的调用由于丢失了类型信息,因此,不会产生引用计数,当函数调用结束时,flag释放,对应字符串的引用计数减1后变为0,因此就释放掉了,后续再对StackFlag中的数据进行引用,就会导致野指针
var
P: PChar;
begin
P := Str;
Dec(P, SizeOf(Cardinal));
Result := Cardinal(Pointer(P)^) - SizeOf(Cardinal);
end;
你看一下这个系统函数吧,计算长度。
还有近很多错误啊! 怎么用啊!
你将这个
flag:pchar;
试试吧