第一次机会异常(ntdll.dll)

时间:2013-07-02 06:48:46

标签: c++ sfml

为什么我收到此错误的任何想法?

这是完整的错误:

  

Test.exe 0xC0000005中0x77202282(ntdll.dll)的第一次机会异常:访问冲突写入位置0x0000004

     

在Test.exe 0xC0000005中的0x77202282(ntdll.dll)处取消异常处理异常:访问冲突写入位置0x0000004

  • 在第Grid::Grid()行调试中断。
  • Root.hpp包含私人会员static Grid grid;
  • Root.cpp初始化此Grid Root::Grid;

我确实有SFML静态链接,这给我带来了一些麻烦。

这是一个显示此错误的小例子:

#include <fstream>
#include <sstream>
#include <Windows.h>

#include "Root.hpp"

Grid Root::grid;

int main (uchar argc, char **argv) {
    Root root;
    Root::Prepare(root);
    return Root::GetStatus();
}

构造函数如下:

Grid::Grid() {
    Width = 100;
    Height = 100;
}

调用堆栈:

ntdll.dll!772022b2()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
Test.exe!sf::priv::MutexImpl::lock(void)    Unknown
Test.exe!sf::Mutex::lock(void)  Unknown
Test.exe!sf::Lock::Lock(class sf::Mutex &)  Unknown
Test.exe!sf::GlResource::GlResource(void)   Unknown
Test.exe!sf::Texture::Texture(void) Unknown
>   Test.exe!Grid::Grid() Line 5    C++
Test.exe!`dynamic initializer for 'Root::grid''() Line 11   C++
msvcr110d.dll!_initterm(void (void) * * pfbegin, void (void) * * pfend) Line 894    C
Test.exe!__tmainCRTStartup() Line 460   C
Test.exe!mainCRTStartup() Line 377  C
kernel32.dll!767533aa() Unknown
ntdll.dll!77219ef2()    Unknown
ntdll.dll!77219ec5()    Unknown

1 个答案:

答案 0 :(得分:2)

即使没有完整的源代码,您获得的异常以及您显示的堆栈看起来与另一个解决的Stack Overflow帖子看起来非常相似:

Unhandled exception at 0x777122D2 (ntdll.dll) in ArticxEngine.exe: 0xC0000005: Access violation writing location 0x00000004

你的堆栈显示Grid()派生自SFML的Texture(),它是从GlResource()依次派生的。问题是你的网格是一个静态变量,它是在GlResource()的内部互斥体之前构造的。

解决方案与其他Stack Overflow帖子相同:确保您的Grid对象是非静态的,并在main()开始运行后构建。