2013-05-08 50 views
-4

我在下面的一段代碼中遇到了錯誤處理錯誤。有什麼可能導致它的建議嗎? Error : Invalid deque <T> subscript無效的deque <T>下標。爲什麼我得到這個錯誤?

typedef boost::shared_ptr<HistObj> shared_hist_def; 
     typedef std::deque<shared_hist_def> vector_def; 
     typedef boost::shared_ptr<vector_def> shared_vector_def; 
     typedef boost::unordered_map<int,shared_vector_def> in_map_def; 
     typedef boost::shared_ptr<in_map_def> shared_inner_map_def; 

Domain::shared_hist_def& Domain::GetSpecificHistoricalTuple(const std::string& symb,const int& tframe,const int& val) 
{ 
    Domain::shared_inner_map_def tshare = stat_History_base[symb]; 
    shared_vector_def tmp = tshare->at(tframe); 
    try 
    { 
     Domain::shared_hist_def safe_tuple = tmp->at(val); 
     return safe_tuple; 
    } 
    catch (std::exception &ex) 
    { 
     std::string a = ex.what(); 
     __debugbreak(); 
    } 
} 

的更多信息:

上述方法是一個靜態方法。程序是多線程的。任何發生此錯誤的機會都是因爲多線程訪問它。我有這樣的假設,但後來認爲上述函數參數一次不可能是相同的。

+0

什麼是錯誤? – 0x499602D2 2013-05-08 15:40:31

+0

剛剛添加到帖子 – MistyD 2013-05-08 15:42:19

+0

我沒有看到'stat_History_base'的定義,但它不是本地的函數,所以可能會導致多線程的問題。 – 2013-05-08 15:44:44

回答

0

您的val參數似乎太高(大於或等於deque中的元素數量),或者可能是負值。

+0

我總是檢查我的val參數。當發生異常時。此外,容器的索引值爲val。 – MistyD 2013-05-08 15:46:46

+0

我很抱歉,但您如何知道容器在異常時的'val'索引處具有對象?它看起來像'at(val)'本身失敗。也許在調用'at'之前檢查/記錄val和size會顯示一些內容。另外,如果程序是多線程的,那麼在另一個線程保留舊索引時,是否有一個線程可以修改該deque? (運行它單線程將顯示此。) – Inspired 2013-05-08 15:55:44

+0

是的我懷疑是這個問題。這就是爲什麼我將鎖添加到我的代碼 – MistyD 2013-05-08 16:01:26

相關問題