这个读访问违规异常应该是什么原因?

时间:2011-09-19 07:25:04

标签: c++ access-violation

我的程序崩溃并显示一个对话框

"Unhandled exception at 0x3aaf1aea (pmsqlsrv.dll) in java.exe: 0xC0000005:
Access violation reading location 0x3ac60880."

显示为导致崩溃的声明是

m_pDatabase->m_pIDBCreateCommand->CreateCommand();

在观察窗口中,

"this" pointer value for the containing object is 0x7395fcaf
m_pDatabase                                    is 0xffff8810 (does it look like a valid address?)
m_pDatabase->m_pIDBCreateCommand               CXX0030: Error: expression cannot be evaluated

崩溃对话框中显示的地址 - 0xC0000005和0x3ac60880我不知道它们是什么。这是否意味着dll(pmsqlsrv.dll)本身已损坏且崩溃是在读取代码段而不是访问数据?

2 个答案:

答案 0 :(得分:0)

在32位Windows中,地址0xC0000000及更高版本是为内核保留的。通常,内核地址空间甚至在0x80000000开始。所以这个地址看起来确实不健康。

答案 1 :(得分:0)

0xC0000005是内核的“段错误”中断异常处理程序的地址:在尝试访问不属于您的进程的内存地址时调用它。

你的m_pDatabase指向0xffff8810(非常奇怪的内存地址:指向静态数据区......是否正确初始化了?) 由于它很可能不是一个有效的地址,它包含一些无意义的值,使得程序认为m_pIDBCreateCommand中有一些东西(可能是一个随机值)通过获取函数的地址来调用。这使得它在两个或三个间接之后访问其进程边界之外的内存。

了解如何通过您的程序初始化,分配和更改m_pDatabase。