用CodeGuard捕捉到程序关闭时的错误,请进来帮忙看看!thx~

yydelphi 2005-05-16 11:16:40
void __fastcall ThreadRecv::Execute()
{ ......
......
while ( !Terminated )
{
......
......
tvSelect.tv_sec = 0;
tvSelect.tv_usec = 500 * 1000;
if ( select(FD_SETSIZE, &fds_t, NULL, NULL, &tvSelect) < 0 )
{
continue;//最后提示出错在这里。
}
......
......
}
}

CodeGuard Log:
Access in freed memory:...
the memory block ... was allocated with SysGetMem. //这里提示在continue
the memory block ... was freed with SysFreeMem.//这里提示在FormDestroy的函数

这是怎么回事?访问已经删除的东西?怎么解决?谢谢
...全文
204 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yydelphi 2005-05-18
  • 打赏
  • 举报
回复
再次感谢JSP大老!
yydelphi 2005-05-17
  • 打赏
  • 举报
回复
感谢JSP老大!
再问一下,我在线程创建的时候让FreeOnTerminatek=True.
在线程结束的时候我在线程中new出来的东西它会不会给我自动delete?
还有,pthread是继承的C++builder中TThread类,那还要不要重新构造析构函数?
继承过来的析构函数能不能把new出来的东西自动delete?
jishiping 2005-05-17
  • 打赏
  • 举报
回复
当 FreeOnTerminatek=True 时,线程执行结束后,VCL 会自动删除这个线程对象,但是在
线程中 new 的其它对象,当然还需要程序自己负责delete
pthread 可以有自己的析构函数,也可以没有自己的析构函数。无论是否有析构函数,自己
在线程中new的东西,还需要程序自己删除。
leonatcs 2005-05-16
  • 打赏
  • 举报
回复
代码不够,再多贴些。
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
the memory block ... was freed with SysFreeMem,这里双击提示在:
/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { } (Forms.hpp中)
jishiping 2005-05-16
  • 打赏
  • 举报
回复
Error 00017. 0x100430 (r) (Thread 0x0F60):
Access in freed memory: Attempt to access 1 byte(s) at 0x011D3DF4.
vsprintf(0x017DBBC4, 0x0040F122 ["StringToknizer:changed buf='%s'\n"],
0x017DFC04)

Call Tree:
0x00402E37(=LogClient.exe:0x01:001E37) G:\work\logclient02\logclient2\logclient\logfile.cpp#478
0x004088B8(=LogClient.exe:0x01:0078B8) G:\work\logclient02\logclient2\logclient\StringTokinzer.cpp#109

这个说的是logfile.cpp的第478行代码调用vsprintf函数时,地址越界了,访问了越界的
地址中的1个字节。我估计是vsprintf函数的第一个参数指向的内存块不够大(比实际需
要的内存小了1个字节)。
jishiping 2005-05-16
  • 打赏
  • 举报
回复
rror 00097. 0x300010 (Thread 0x0E00):
Resource leak: The file handle (0x3) was never closed

The file handle (0x00000003) [name: 'c:\current.logclient.log'] was opened
with open
Call Tree:
0x00402A06(=LogClient.exe:0x01:001A06) G:\work\logclient2\logclient\logfile.cpp#320

这个说的就是logfile.cpp的第320行代码,打开文件c:\current.logclient.log后没有关闭。
jishiping 2005-05-16
  • 打赏
  • 举报
回复
不知道楼主看明白了上面的错误信息没有。

第一个:
Error 00058. 0x300010 (Thread 0x0FD0):
Resource leak: The object (0x11D3FE0) was never deleted

The object (0x011D3FE0) [size: 1 bytes] was created with new
Call Tree:
0x004080FD(=LogClient.exe:0x01:0070FD) G:\work\logclient02\logclient2\logclient\StringTokinzer.cpp#28
0x0040A03B(=LogClient.exe:0x01:00903B) G:\work\logclient02\logclient2\logclient\thread.cpp#371
0x0040901A(=LogClient.exe:0x01:00801A) G:\work\logclient02\logclient2\logclient\thread.cpp#130

说的就是StringTokinzer.cpp中第28行new的变量没有delete
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
Error 00017. 0x100430 (r) (Thread 0x0F60):
Access in freed memory: Attempt to access 1 byte(s) at 0x011D3DF4.
vsprintf(0x017DBBC4, 0x0040F122 ["StringToknizer:changed buf='%s'\n"],
0x017DFC04)

Call Tree:
0x00402E37(=LogClient.exe:0x01:001E37) G:\work\logclient02\logclient2\logclient\logfile.cpp#478
0x004088B8(=LogClient.exe:0x01:0078B8) G:\work\logclient02\logclient2\logclient\StringTokinzer.cpp#109
0x0040A0A5(=LogClient.exe:0x01:0090A5) G:\work\logclient02\logclient2\logclient\thread.cpp#382
0x0040901A(=LogClient.exe:0x01:00801A) G:\work\logclient02\logclient2\logclient\thread.cpp#130
0x4003601F(=rtl60.bpl:0x01:03501F)
0x400067CE(=rtl60.bpl:0x01:0057CE)

The memory block (0x011D3DEC) [size: 22 bytes] was allocated with SysGetMem
Call Tree:
0x40002FCF(=rtl60.bpl:0x01:001FCF)
0x40115038(=vcl60.bpl:0x01:064038)
0x4010A9A8(=vcl60.bpl:0x01:0599A8)
0x4010AAE0(=vcl60.bpl:0x01:059AE0)
0x4010A9A8(=vcl60.bpl:0x01:0599A8)
0x40037EEA(=rtl60.bpl:0x01:036EEA)

The memory block (0x011D3DEC) was freed with SysFreeMem
Call Tree:
0x40002FEF(=rtl60.bpl:0x01:001FEF)
0x40115038(=vcl60.bpl:0x01:064038)
0x4010A9A8(=vcl60.bpl:0x01:0599A8)
0x4010AAE0(=vcl60.bpl:0x01:059AE0)
0x4010A9A8(=vcl60.bpl:0x01:0599A8)
0x40037EEA(=rtl60.bpl:0x01:036EEA)
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
Error 00051. 0x300010 (Thread 0x0FD0):
Resource leak: The file handle (0x3) was never closed

The file handle (0x00000003) [name: 'c:\current.logclient.log'] was opened
with open
Call Tree:
0x00402A06(=LogClient.exe:0x01:001A06) G:\work\新建文件夹\logclient02\logclient2\logclient\logfile.cpp#320
0x00408BB7(=LogClient.exe:0x01:007BB7) G:\work\新建文件夹\logclient02\logclient2\logclient\thread.cpp#60
0x4003601F(=rtl60.bpl:0x01:03501F)
0x400067CE(=rtl60.bpl:0x01:0057CE)
0x7C80B50B(=kernel32.dll:0x01:00A50B)
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
Error 00058. 0x300010 (Thread 0x0FD0):
Resource leak: The object (0x11D3FE0) was never deleted

The object (0x011D3FE0) [size: 1 bytes] was created with new
Call Tree:
0x004080FD(=LogClient.exe:0x01:0070FD) G:\work\logclient02\logclient2\logclient\StringTokinzer.cpp#28
0x0040A03B(=LogClient.exe:0x01:00903B) G:\work\logclient02\logclient2\logclient\thread.cpp#371
0x0040901A(=LogClient.exe:0x01:00801A) G:\work\logclient02\logclient2\logclient\thread.cpp#130
0x4003601F(=rtl60.bpl:0x01:03501F)
0x400067CE(=rtl60.bpl:0x01:0057CE)
0x7C80B50B(=kernel32.dll:0x01:00A50B)
Functions called:
delete (35 times)
strcmp (3 times)
sscanf (3 times)
strchr (12 times)
strncmp (2 times)
strcpy (3 times)
write (88 times)
strftime (88 times)
vsprintf (88 times)
fstat (89 times)
open (1 times)
access (1 times)
sprintf (91 times)
strlen (241 times)
localtime (179 times)
strncpy (14 times)
time (187 times)
memset (294 times)
vsnprintf (560 times)
SysReallocMem (59 times)
SysFreeMem (2203 times)
SysGetMem (2214 times)
realloc (1 times)
memcpy (4 times)
delete[] (2 times)
free (28 times)
new[] (14 times)
new (47 times)
calloc (5 times)
malloc (25 times)
Resource types used:
file handle (1 allocs, 1 max)
object array (14 allocs, 13 max)
object (47 allocs, 35 max)
memory block (2245 allocs, 1192 max)
jishiping 2005-05-16
  • 打赏
  • 举报
回复
你就不用自己来描述了,我看你自己也说不清。不用在IDE中运行,直接在资源管理器
中运行,第一次出错时,CodeGuard会提示你有错误。程序结束后会产生一个.cgl 结尾
的文件,将它的内容贴出来。
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
这个问题更刚开始我问的不一样了。
我开了CodeGuard运行的话程序关闭时提示错误在continue语句(就是最开始贴的)那里。
不开CodeGuard运行的话一切正常! ??
这个错误好像是:我调用了一个类写读写文件.
LogFile * plogfile = new LogFile;
plogfile->open(..);

用完后我没有plogfile->close(); ???
但是LogFile类的析构函数中我close了的。
最后也delete plogfile了。
开CodeGuard第一次编译运行没这个错误,但是结束程序再编译运行,就有这个错误了。把C++Builder
关了再打开,就又没这个错误了。总之BCB打开程序第一次编译没这个错误。
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
logfile.cpp#320:
#ifdef __WIN32__
file0 = open(currentLogPathName, O_WRONLY|O_CREAT|O_APPEND, S_IREAD|S_IWRITE);
#else
file0 = open(currentLogPathName, O_WRONLY|O_CREAT|O_APPEND, logshare);
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
Error 00097. 0x300010 (Thread 0x0E00):
Resource leak: The file handle (0x3) was never closed

The file handle (0x00000003) [name: 'c:\current.logclient.log'] was opened
with open
Call Tree:
0x00402A06(=LogClient.exe:0x01:001A06) G:\work\logclient2\logclient\logfile.cpp#320
0x0040805B(=LogClient.exe:0x01:00705B) G:\work\logclient2\logclient\thread.cpp#60
0x4003601F(=rtl60.bpl:0x01:03501F)
0x400067CE(=rtl60.bpl:0x01:0057CE)
0x7C80B50B(=kernel32.dll:0x01:00A50B)

------------------------------------------

constantine 2005-05-16
  • 打赏
  • 举报
回复
贴出JSP老大说的东西
jishiping 2005-05-16
  • 打赏
  • 举报
回复
使用CodeGuard时,程序运行结束后,洄游一个.cgl结结尾的文件,用记事本打开就可以了。
贴出这个文件中的内容。同时,他力面的信息,包含了出错的源程序以及相应的行号。将相
应行号附近的代码贴出。
yydelphi 2005-05-16
  • 打赏
  • 举报
回复
但是我这里只有一个线程啊。
代码太多了,不知道怎么贴
我不懂电脑 2005-05-16
  • 打赏
  • 举报
回复
多线程程序在一个线程释放了共享资源后,另一个线程又去访问被释放的资源造成的。
内容概要:本文系统研究了基于模型预测控制(MPC)与滚动域估计(MHE)集成的控制方法,旨在实现动态系统的高精度目标点镇定。通过构建MPC与MHE的协同框架,利用MHE对系统状态进行实、高效的滚动优化估计,克服传感器测量噪声与初始状态不确定的影响,并将估计结果反馈至MPC控制器,实现对未来控制序列的滚动优化,从而提升系统在复杂干扰和不确定性环境下的镇定性能与鲁棒性。研究涵盖算法原理推导、数学建模、仿真设计与验证全过程,提供了完整的Matlab代码实现,充分展示了该集成策略在状态估计与反馈控制协同优化方面的优越性。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、机器人、航空航天或相关领域研究的研发人员及研究生。; 使用场景及目标:①应用于移动机器人、无人机、自动驾驶等需要高精度状态反馈的自主系统目标点镇定任务;②解决系统状态不可直接测量或受强噪声干扰的状态估计与反馈控制耦合问题;③为先进预测控制与状态估计算法的联合设计与工程实现提供可复现的技术范例与实践指导; 阅读建议:建议读者结合Matlab代码逐模块分析算法实现细节,重点关注MHE状态估计与MPC控制指令生成之间的数据交互逻辑与序配合,并尝试在不同非线性系统模型上进行迁移测试,以深入理解MPC-MHE集成机制的核心优势与调参规律。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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