我正在使用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.
以下是异常后的屏幕截图。
我不能在这里发布整个代码,因为项目包含很多源代码,但情况类似于
global.h
extern QString outfilepath;
的main.cpp
QString outfilepath;
...................
...................
outfilepath = somePath;
thread1.cpp
...................
QString tmp1 = outfilepath;
...................
thread2.cpp
...................
QString tmp2 = outfilepath;
...................
答案 0 :(得分:1)
通过异常消息,我会说你正在访问一个未初始化的对象。代码0xC0000005
表示访问冲突,读取地址为0.看起来您尚未对其进行初始化。
两个线程都应该可以访问外部变量,但是应该始终使用线程安全技术保护多个线程访问的数据,例如你提到的互斥锁。