-4
我正在使用Qt和C++的項目,並且項目使用多個線程和外部全局變量。 extern變量正在從不同的線程讀取和寫入,因爲當前沒有執行mutex來讀取/寫入這些變量。現在我在運行程序時遇到了一些異常,並且這種情況不是每次都發生,而是隨機發生。Qt C++讀取訪問衝突異常
這些都是從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;
...................
讓我們變得真實:您顯示了4條語句,沒有語境,並期望我們找出錯誤?很少有它會飛的情況。假裝顯示的代碼不是你的,而是我的。你能幫助我嗎?不。所以請幫助我們通過展示一個能夠再現問題的最小*自包含*測試案例來幫助您。您將通過製作這樣的測試案例學到很多東西。首先複製你的項目,並開始扔掉東西。應該刪除每個不會導致問題消除的聲明和聲明。 –
我的直覺是你沒有足夠的知識來正確地實現多線程,但是不可能知道你到底知道了什麼:( –
)可能的錯誤源的數量是天文數字的,'outfilepath'可能已經被流氓粉碎了指針或溢出,但我們可以排除Ninjas – user4581301