2016-02-25 172 views
-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. 

一些輸出這裏是異常後的截圖。

enter image description here

  1. 這是發生因爲外部變量不是線程安全的?
  2. 或者由於變量未初始化,但在調試時我可以看到變量有一些數據。

編輯

我不能發佈整個代碼在這裏作爲項目包含大量的源代碼,但情況是一樣的東西

global.h

extern QString outfilepath; 

main.cpp

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

thread1.cpp

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

thread2.cpp

................... 
QString tmp2 = outfilepath; 
................... 
+2

讓我們變得真實:您顯示了4條語句,沒有語境,並期望我們找出錯誤?很少有它會飛的情況。假裝顯示的代碼不是你的,而是我的。你能幫助我嗎?不。所以請幫助我們通過展示一個能夠再現問題的最小*自包含*測試案例來幫助您。您將通過製作這樣的測試案例學到很多東西。首先複製你的項目,並開始扔掉東西。應該刪除每個不會導致問題消除的聲明和聲明。 –

+1

我的直覺是你沒有足夠的知識來正確地實現多線程,但是不可能知道你到底知道了什麼:( –

+2

)可能的錯誤源的數量是天文數字的,'outfilepath'可能已經被流氓粉碎了指針或溢出,但我們可以排除Ninjas – user4581301

回答

1

由異常消息,我會說你訪問一個未初始化的對象。代碼0xC0000005表示訪問衝突,讀取地址爲0.看起來您尚未初始化它。

外部變量應該可以被兩個線程訪問,但是您應該始終使用線程安全技術保護多線程訪問的數據,例如您提到的互斥體。