求助,有关PChar无法释放的错误,请大虾帮忙!

hxf812 2001-09-10 04:12:35
各位大虾,小弟遇到这样一个问题,代码如下

procedure TForm1.Button1Click(Sender: TObject);
var
pS : PChar;
Str : string;
begin
try
try
pS := StrAlloc(100);
StrPCopy(@pS,'ABCDEF');//必须这样写,不能去掉'@'
Str := PChar(@pS);
ShowMessage(Str);
except

end;//except
finally
StrDispose(pS);{出错代码!!删去该行也出错}
//StrDispose(@pS);{还是出错}
//Dispose(pS);{仍旧出错!!}
end;//finally
end;
前面的代码都正确,一执行到 释放(pS) 就出错,FreeMem也不行
请问我该如何释放pS变量
...全文
495 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tan_Jian 2001-09-14
  • 打赏
  • 举报
回复
var P: PChar;
getmem(P,256);
strcopy(P,pchar('hdfdgdf'));
freemem(P)
ngkai 2001-09-14
  • 打赏
  • 举报
回复
to arxing(阿行)
这不是用什么工具的问题,c的程序员用不好也会出错。指针内存的操作在于程序员的水平不在于工具,pascal操作内存不比c差。

zjqyb 2001-09-14
  • 打赏
  • 举报
回复
type
myrec=record
buff:array[1..n] of char;
end;

procedure test(var S :myrec);
begin
strmove(@s.buff,'ABCD',sizeof('abcd'));
end;
arxing 2001-09-13
  • 打赏
  • 举报
回复
管理内存,最好用C。
SimonDW 2001-09-13
  • 打赏
  • 举报
回复
Str := PChar(@pS);
去掉这句的@
victorlee_lq 2001-09-13
  • 打赏
  • 举报
回复
回复人: arxing(阿行) (2001-9-13 11:24:51) 得0分
管理内存,最好用C。
回复人: victorlee_lq(victor) (2001-9-13 15:22:37) 得0分
我在这里大声疾呼 "PB 是垃圾!!!"
victorlee_lq 2001-09-13
  • 打赏
  • 举报
回复
我在这里大声疾呼 "PB 是垃圾!!!"
zzy1012 2001-09-12
  • 打赏
  • 举报
回复
gz
ngkai 2001-09-12
  • 打赏
  • 举报
回复
在procedure test(var S :pchar);中对s 分配内存又dispose掉的作法对返回s是无意义的因为重要的不是s的值也就是地址,而是s所指向的内存区域,所以var s : pchar的写法也不可取。在返回之前已被你释放的内存对你有何意义。如果你转递是指针,可以在外部释放的只是别忘记了就行。
hxf812 2001-09-10
  • 打赏
  • 举报
回复
我在穿参数时改用记录类型(结构体)来做,问题就解决了。这样就不存在指针释放的问题了,虽然问题解决了,但我总觉得。。。。这样设计程序。。。。不太好。

我在这里大声疾呼 "PB 是垃圾!!!"
(没有人持反对意见吧)
hxf812 2001-09-10
  • 打赏
  • 举报
回复
看来不只是我遇到这中情况,Leehunter 也遇到了 看帖子 http://www.csdn.net/expert/TopicView.asp?id=79545

to chechy(chechy):
听我一句话,千万别用。

chechy 2001-09-10
  • 打赏
  • 举报
回复
我没用过PB,但是这么看,PB简直太不可思议了,不合常理。
hxf812 2001-09-10
  • 打赏
  • 举报
回复
不释放也出错,我很奇怪,Str := PChar(@pS);都没出错,怎么会不能释放呢?
哪位用过PB的高人遇到过这种情况?
chechy 2001-09-10
  • 打赏
  • 举报
回复
那就别释放了,而且也不用Alloc了。
hxf812 2001-09-10
  • 打赏
  • 举报
回复
正有此意,不过指针释放都出错,就算我专为PB写一个,也还是出错。
disney 2001-09-10
  • 打赏
  • 举报
回复
这样好了,你写两个代码,D5、VB用一个,PB用一个:)
hxf812 2001-09-10
  • 打赏
  • 举报
回复
大家救命啊!
hxf812 2001-09-10
  • 打赏
  • 举报
回复
to hwill(潜龙在渊):没用的,我试过了
to disney(编程乐园),hellion:
难没什么好办法了吗,我也不想这样用strpcopy可没办法,我写的Dll最终是要由pb调用的,别的方法我都试过了,好象只能这样写
Dll中的代码如下
procedure Test(Var s :pchar); stdcall;
begin
//一个最简单的例子,返回一个串
strpcopy(s,'ABCDEF');//D5,Vb对,PB接收不到返回值
//修改成strpcopy(@s,'ABCDEF');PB 对了,VB,D5 出错
end;
我的Dll是为PB程序编写的,只要PB能用就行。我明天就要交工了,大家救命啊!
chechy 2001-09-10
  • 打赏
  • 举报
回复
不去掉@,根本就是错误的程序。
disney 2001-09-10
  • 打赏
  • 举报
回复
这样分析对不对:
这个函数是给PB使用的。而PB在传S参数时,应该传给一个已经分配了空间的指针。所以,DELPHI中最好不用分配和释放空间。如果你分配了空间,而在没有返回前就释放掉,PB使用这个值将是很危险的,会产生奇怪的结果。如果PB部分也是你做,就好说了。
加载更多回复(9)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧