C++builder编写的程序出错
我用C++builder 2010编写的一个程序在运行一段时间后就会提示错误:access violation at address 76E859C7 in module 'ntdll.dll'.Read of address 36653963。我在网上找了很多资料都是说内存非访问,但是我找了很久也不知道是在哪里出错了。求问各位大神有没有比较好的办法去准确的找到出错的地方呢?或者是告诉我大概是哪里出错了。 C++builder 访问内存出错 ntdll.dll 内存
[解决办法]
不好查呀不好查。内存泄漏、非法访问都是不好查的
建议安装eureKaLog软件,报错了会提示具体错误代码行,希望对你有
[解决办法]
可以记录,有日志,报错提示都不一样,你先研究一下吧
[解决办法]
十之八九是访问了一个野指针。贴出你的代码吧
[解决办法]
AV错误一般较难定位出错地方的,特别是越界溢出等AV错误。
1、打开编译器警告,处理警告:使用未初始化的指针。
2、共用的类,检查构造函数,保障每个变量都已经初始化。
3、数组或内存越界检查。用codeguard 或 eureKaLog等检查,如果内存越界,则会有提示。
4、所有强制指针转换的地方,需要仔细确认。
5、同一内存块内的变量越界,无法检出,需要调试。
表现的现象是访问了一个野指针(Read of address 36653963) , 但造成这个现象的原因,可能是因为
1、越界写,
2、指针未初始化,
3、使用已经delete了的内存,
4、错误的指针强制转换,
5、使用不同的内存管理器来分配及释放内存,如DLL中new,exe中delete,new 构造 free释放。即申请内存与释放内存的函数要配对,不能混用。
C++: new-delete malloc-realloc-free new[]--delete[]
VCL: GetMemory-ReallocMemory-FreeMemory SysGetMem-SysFreeMem
WINAPI: VirtualAlloc-VirtualFree
如果不匹配,则可能造成内存错误。不能释放内存就用delete,那是不负责任,需要看出处,如果是DLL中分配的内存,则调用DLL中的函数去释放。这也是BPL包比DLL方便易用的原因,使用同样的内存管理器,不需要回到指定BPL中delete.
内存错误难处理,因为太复杂了。总共上万行不算多,一个pas文件几W行也常见,就怕一个函数上W行。
[解决办法]
代码都没放出来,单凭这个错误,只能看出来是非法访问内存