求助,有关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变量
...全文
519 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)
内容概要:本文围绕基于双向反激变换器的电池SOC(State of Charge,荷电状态)均衡技术开展深入的仿真研究,依托Simulink平台搭建系统模型,实现对电池组内各单体电池之间SOC差异的有效调控。研究重点对比了PI控制、二阶滑模控制与有限集模型预测控制等多种先进控制策略,系统分析了它们在均衡速度、控制精度及系统动态响应稳定性等方面的性能表现,旨在提升电池管理系统中能量利用效率与延长电池组整体使用寿命。该仿真体系具有较强的通用性和可扩展性,适用于对电池一致性要求较高的工程应用场景。; 适合人群:具备电力电子技术、自动控制理论及Simulink仿真基础的电气工程、自动化、新能源等相关专业的硕士研究生、科研人员,以及从事电池管理系统(BMS)开发的工程技术人员。; 使用场景及目标:①针对电池组中因制造差异或使用环境导致的单体SOC不一致问题,研究高效的主动均衡解决方案;②定量比较不同控制算法在非线性、强耦合的电池均衡系统中的动态响应特性和稳态性能,为算法选型提供依据;③为电动汽车、无人机及大规模储能系统的电池管理硬件设计与软件控制策略优化提供可靠的仿真验证平台和技术参考。; 阅读建议:建议读者结合提供的Simulink模型文件进行同步仿真运行与参数调试,重点关注双向反激变换器的拓扑结构、控制模块的设计逻辑以及各类控制器的参数整定过程,深入理解滑模控制的鲁棒性与模型预测控制的前瞻性优势,为进一步拓展至多电池串并联系统的复杂均衡策略研究奠定坚实基础。

5,943

社区成员

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

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