对象的创建和释放!!,为什么我在释放我的对象时总是显示内存错误??在线等。。(100分)

  • 主题发起人 主题发起人 shadowno
  • 开始时间 开始时间
S

shadowno

Unregistered / Unconfirmed
GUEST, unregistred user!
对象的创建和释放!!,为什么我在释放我的对象时总是显示内存错误??在线等。。
内有代码!!

type
Tql = class(Tobject)
private
ks: array[0..1]of char;
ml: array[0..1]of char;
public
function Read():smallint;
function make(hexstr:pchar):smallint;
end;

function Tql.Read():smallint;
begin
........
...
end;

function Tql.make(hexstr:pchar):smallint;
begin
....
..
end;

////////////////////////////////////
其他单元在引用是如下。
procedure Tfsell.ToolButton3Click(Sender: TObject);
var userQL:Tql
begin
userQL:=Tql.create;
....
....
...
userQL.free;
fsell.close;
end;

而且该错误是在退出ToolButton3Click事件时发生的.错误信息为:
project gasman.exe raised exception class EAccessViolation with message'Access
Violation at Address 00000000.read of address 00000000'.Process stopped.Use Step
or Run to continue.


该怎样优化我的这一小段代码?我对对象操作不熟,请多指教,谢谢!!!
 
数组没有初始化。
 
代码贴全一点啦!
 
根据提示信息表明:不是你没有释放,而是你有些东西在访问前没有分配内存,或已经释放了
再去访问
你再看看你的代码,别急
 
肯定是还有其他的对象没实例化
 
能把:
procedure Tfsell.ToolButton3Click(Sender: TObject);
var userQL:Tql
begin
userQL:=Tql.create;
....
....
...
userQL.free;
fsell.close;
end;
这一块再帖全点么
 
其中多数是自定义的函数!应该没有大问题,如果贴出来就太多了!
 
procedure Tfsell.ToolButton3Click(Sender: TObject);
var usrpaswrd: array[0..5] of char;
resul:smallint;
bh,gqcs,gql,xsbj,gfbj:string;
userQL:Tql;
begin
strcopy(usrpaswrd,pchar(UF_MMA));
resul := xiugaiquan(usrpaswrd);
userQL:= Tql.create;
userQL.setbh(pchar(inttostr(strtoint(copy(bh,1,5)))));
userQL.setgql(pchar(gql));
userQL.setxsbj(pchar(xsbj));
userQL.setgfbj(pchar(gfbj));
userQL.setmma(pchar(UF_MMA));
userQL.make('68a516');
userQL.Read();
userQL.Free;
fsell.close;
end;


 
你设一个断点看到底是哪一步出的问题,说不定还没有Free就出问题了。另外,贴全点,
不然别人怎么知道是哪个地方出了错呢?
 
其中都是对userql的操作,关键是所有代码执行完了,都没有错,而是在退出最后一个
end的时出错的!
 
真的要都贴出来才有办法吗?
 
procedure Tfsell.ToolButton3Click(Sender: TObject);
var usrpaswrd: array[0..5] of char;
resul:smallint;
bh,gqcs,gql,xsbj,gfbj:string;
userQL:Tql;
begin
strcopy(usrpaswrd,pchar(UF_MMA));
resul := xiugaiquan(usrpaswrd);
userQL:= Tql.create;//创建Tql的实例,正常!
userQL.setbh(pchar(inttostr(strtoint(copy(bh,1,5)))));设置Tql的成员值,正常!
userQL.setgql(pchar(gql));设置Tql的成员值,正常!
userQL.setxsbj(pchar(xsbj));设置Tql的成员值,正常!
userQL.setgfbj(pchar(gfbj));设置Tql的成员值,正常!
userQL.setmma(pchar(UF_MMA));设置Tql的成员值,正常!
userQL.make('68a516');将Tql的成员值写到设备上,正常!
userQL.Read();对设备的数据进行校验,正常!
userQL.Free;释放实例,正常!
fsell.close;关闭窗口,正常!
end;结束,正常!

系统停顿1-3秒,弹出错误框!


?????????????????????????
 
是否有定时刷新?
 
以我的经验判断,错误不在这里——不过一定有错误,在你认为有问题的地方用这个函数
-----------------------------------------------------------------------------
procedure WriteToLog(strFileName:string;strMsg: string);
var
hLogFile :TextFile;
begin
try
if FileExists(strFileName) then
begin
AssignFile(hLogFile,strFileName);
Append(hLogFile);
end
else
begin
AssignFile(hLogFile,strFileName);
Rewrite(hLogFile);
end;
Writeln(hLogFile,strMsg);
finally
CloseFile(hLogFile);
end;
end;
---------------------------------------------------------------------------
写一个日志文件,看问题究竟出在哪个区域!然后在逐步细化,30分钟内肯定解决。我有几个
类似的错误都是用这种方法解决的。
 
这种情况我遇到过N回,你的写内存语句肯定是把某个重要的内存区域给改写了。
结果是写的时候没问题(因为这块内存是可读写的),关闭的时候有问题(因为
你改写了某些重要的东西,比如字符串或数组的内存地址)。

你把你ToolButton3Click中的语句都注释掉,只留下创建和释放。然后再一条一条的加上
去。如果某条语句加上后,释放出问题,就是他了。
 
还有其他看法吗???

调试中....
 
用完了将对象指针置为空
 
procedure Tfsell.ToolButton3Click(Sender: TObject);
var usrpaswrd: array[0..5] of char;
resul:smallint;
bh,gqcs,gql,xsbj,gfbj:string;
userQL:Tql;
begin
strcopy(usrpaswrd,pchar(UF_MMA));
resul := xiugaiquan(usrpaswrd);
userQL:= Tql.create;//创建Tql的实例,正常!
userQL.setbh(pchar(inttostr(strtoint(copy(bh,1,5)))));设置Tql的成员值,正常!
userQL.setgql(pchar(gql));设置Tql的成员值,正常!
userQL.setxsbj(pchar(xsbj));设置Tql的成员值,正常!
userQL.setgfbj(pchar(gfbj));设置Tql的成员值,正常!
userQL.setmma(pchar(UF_MMA));设置Tql的成员值,正常!
userQL.make('68a516');将Tql的成员值写到设备上,正常!
userQL.Read();对设备的数据进行校验,正常!
userQL.Free;释放实例,正常!
fsell.close;关闭窗口,正常!
end;结束,正常!

系统停顿1-3秒,弹出错误框!


?????????????????????????
 
我参照mywyn的方法注释掉了其他语句只留了
procedure Tfsell.ToolButton3Click(Sender: TObject);
var usrpaswrd: array[0..5] of char;
resul:smallint;
bh,gqcs,gql,xsbj,gfbj:string;
userQL:Tql;
begin
strcopy(usrpaswrd,pchar(UF_MMA));
resul := xiugaiquan(usrpaswrd);
end;结束,正常!

系统停顿1-3秒,弹出错误框!问题依然存在!

project gasman.exe raised exception class EAccessViolation with message'Access
Violation at Address 00000000.read of address 00000000'.Process stopped.Use Step
or Run to continue.

下面是相关的系统调用!
unit ufunction

interface
function rsct_4442(icdev: longint;counter:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'rsct_4442';
function xiugaiquan(password:pchar):smallint;

implementation
function xiugaiquan(password:pchar):smallint;
{若卡的错误计数器为0,则为废卡,返回-1;
输入的密码正确,返回0;
不正确,返回错误计数器的值+1}
var
karpaswrd:array[0..2]of char;
st,count:smallint;
begin
count:=0;
st := rsct_4442(idev,@count);
if count >0 then begin
zh16(karpaswrd,password,6);
st := csc_4442(idev,3,karpaswrd);
end;
if st=0 then xiugaiquan := 0
else
xiugaiquan := -(count+1);
end;
 
1.确保UF_MMA的长度小于等于usrpaswrd的长度。
2.继续注释xiugaiquan。如果问题却是他造成的再在xiugaiquan中注释掉所有的rsct_4442。
 
后退
顶部