Qt C ++读取访问冲突异常

时间:2016-02-25 18:35:19

标签: c++ multithreading qt

我正在使用Qt和C ++的项目,项目使用多个线程和外部全局变量。 extern变量从不同的线程访问以进行读写,其中当前没有实现读/写这些变量的互斥锁。现在我在运行程序时遇到一些异常,这不是每次都发生,而是随机发生。

这些是来自Qtcreator的输出

Invalid address specified to RtlValidateHeap( 000000778A310000, 000000778E6AF5D0 )
Debug Assertion Failed!

Program: ...AppStore-MSVC_X64\debug\App.exe
File: f:\dd\vctools\crt\crtw32\misc\dbgheap.c
Line: 1322

Expression: _CrtIsValidHeapPointer(pUserData)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
Debug Assertion Failed!


Program: ...AppStore-MSVC_X64\debug\App.exe
File: f:\dd\vctools\crt\crtw32\misc\dbgheap.c
Line: 1328

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts. 

以下是异常后的屏幕截图。

enter image description here

  1. 这是因为extern变量不是线程安全的吗?
  2. 或者由于变量未初始化,但在调试时我可以看到变量有一些数据。
  3. 修改

    我不能在这里发布整个代码,因为项目包含很多源代码,但情况类似于

    global.h

    extern QString outfilepath;
    

    的main.cpp

     QString outfilepath;
     ...................
     ...................
     outfilepath = somePath;
    

    thread1.cpp

     ...................
     QString tmp1 = outfilepath;
     ...................
    

    thread2.cpp

     ...................
     QString tmp2 = outfilepath;
     ...................
    

1 个答案:

答案 0 :(得分:1)

通过异常消息,我会说你正在访问一个未初始化的对象。代码0xC0000005表示访问冲突,读取地址为0.看起来您尚未对其进行初始化。

两个线程都应该可以访问外部变量,但是应该始终使用线程安全技术保护多个线程访问的数据,例如你提到的互斥锁。