PChar需要New和Dispose吗?(10分)

  • 主题发起人 主题发起人 guifuli
  • 开始时间 开始时间
G

guifuli

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位大侠:
请问PChar数据类型需要在使用前进行内存分配,使用完后再释放吗?如果是的话,那么大家看一下下面的程序,为什么在释放时会出地址错误呢?
var
p: PChar;
begin
New(p);
try
//use p do something
finally
Dispose(p);//在这里会出错,为什么?
end;
end;
 
var
p: PChar;
begin
p := StrAlloc(255);
try
//use p do something
finally
StrDispose(p);
end;
end
 
同意楼上的意见,不过我通常是这样的
var
p: PChar;
begin
GetMem(p, 255);
try
// 一些操作
finally
FreeMem(p);
end;
 
直接使用PChar类型就行了,象使用普通变量一样,不要new
 
不能用 New(p), PChar 是已经分配内存的指针,可以直接使用:
var
p: PChar;
a: array [0..100] of char;
begin
StrCopy(a, 'test string');
p:=a;//指向 a
StrCopy(a, 'another string');
Caption:=p;//显示'another string'而不是'test string'。
end;
如果要为字符串创建副本,并使 p 指向副本,可以:
var
p:PChar;
begin
p:=StrNew('Some String');//p 指向'Some String'的副本,副本大小等于字符串'Some String'的大小。
try
...
finally
StrDispose(p);
end;
end;
也可以:
var
p: PChar;
a: array [0..100] of char;
begin
p:=StrAlloc(255);
StrCopy(a, 'test string');
try
strCopy(p, a);
StrCopy(a, 'another string');
Caption:=p;//显示 'test string'而不是'another string'。
finally
StrDispose(p);
end;
end;
 
我的不会出错,你能否给出详细的//use p do something部分代码?
 
楼主的代码如果不对 p 操作,不会出错,一操作,就会出错。
 
PChar实质上是一个^Char(指向Char的指针),其他指针怎么做,它也怎么做。只不还可以用StrAlloc等专门用的函数罢了。

String类就好多了,自己管理内存。
 
接受答案了.
 
后退
顶部