一个奇怪的问题(关于指针)(50分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
TForm2 = class(TForm)
private
{ Private declarations }
lvCP:array of PChar;
cpBh:TStringList;
CheckStat:array of Boolean;
public
{ Public declarations }
constructor create(Owner:TComponent;cp:array of PChar);reintroduce;overload;
destructor destroy;override;
end;

constructor TForm2.create(Owner: TComponent
cp: array of PChar);
var
i:integer;
s:string;
begin
inherited create(Owner);
SetLength(lvCP,High(cp));
setLength(CheckStat,High(cp));
cpBh:=TStringList.Create;
for i:=Low(cp) to High(cp) do
begin
GetMem(lvCP,StrLen(cp)+1)

StrCopy(lvCP,cp);
Checkstat:=False;
[red]s:=lvCP;[/red] // 1
[red]cpBh.Add(MidStr(lvCP,1,Pos('|',lvCP)-1));[/red] //2
end;
end;

destructor TForm2.destroy;
begin
cpBh.Clear
// 3
FreeAndNil(cpbh);
inherited;
end;

上述代码有一个奇怪问题,[blue]当我将1处的代码去掉,
则3处cpbh.clear就会报错。[/blue]EInvalidPoint,
[blue]而只要加上1处的代码,就不会报错了。[/blue]
或将2处改为
cpBh.Add(MidStr(s,1,Pos('|',s)-1));,则在3处报同样的错误

并且如果我直接将1和2处的代码注释掉,而改成下面代码:
cpBh.Add(lvcp)

则程序执行到3处也不会出错。

这问题是出在哪呢?还请各位大侠指点,谢谢!
 
很想帮你测试一下,可惜你的那段
constructor create(Owner:TComponent;cp:array of PChar);reintroduce;overload;
在我这里运行不起来,
destructor destroy;override;这个到是可以运行。
 
SetLength(lvCP,High(cp));
setLength(CheckStat,High(cp));
---->>>>>>>>>>>>>>>>>修改为:
SetLength(lvCP,High(cp)+1);
setLength(CheckStat,High(cp)+1);
 
试一下是不是这个原因
destructor TForm2.destroy;
var
i: integer;
begin
for i:=Low(lvCP) to High(lvCP) do FreeMem(lvCP);
if cpBh<> nil then
begin
cpBh.Clear
// 3
FreeAndNil(cpbh);
end;
inherited;
end;
 
SetLength(lvCP,High(cp));SetLength(lvCP,High(cp)+1);
setLength(CheckStat,High(cp))
setLength(CheckStat,High(cp)+1);
还有你没有回收GetMem(lvCP,StrLen(cp)+1)
分配的指针。
 
上面的代码只是部分代码,我在窗体的button1.onclick事件中写了清除lvCP的代码,
to wrl_001,dcsdcs,我不明白为什么给数组lvcp,checkstat分配内存空间要多加一个1?
SetLength(lvCP,High(cp));
setLength(CheckStat,High(cp));
---->>>>>>>>>>>>>>>>>修改为:
SetLength(lvCP,High(cp)+1);
setLength(CheckStat,High(cp)+1)

是不是由于cp是从0..n,而high(cp)的结果是n,则用setlength分配内存空间时,给lvcp的空间是0..n-1,但lvcp的空间长度是n。哦,有可能是这样理解吧。我对内存分配空间没有弄清楚。
还请指点,谢谢!
 
由于cp是从0..n,而high(cp)的结果是n,用setlength( ,n)分配内存空间时,给lvcp的空间是0..n-1
 
后退
顶部