2013-05-08 30 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

相关问题