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

+0

только что добавлено в сообщение – MistyD

+0

Я не вижу определения 'stat_History_base', но он не является локальным для функции, поэтому, вероятно, вызовет проблемы с многопоточным. –

ответ

0

Ваш параметр val кажется слишком высоким (больше или равен количеству элементов в deque), или, может быть, отрицательный.

+0

Я всегда проверяю свой параметр val. когда происходит исключение. Также контейнер имеет объекты с индексом val. – MistyD

+0

Извините, но откуда вы знаете, что в контейнере есть объекты с индексом 'val' во время исключения? Похоже, что 'at (val)' сам терпит неудачу. Возможно, проверка/регистрация значения val и размера перед вызовом 'at' покажет что-то. Кроме того, если программа многопоточная, может ли быть какая-то вероятность, что один поток изменяет deque, а другой поток сохраняет старый индекс? (Запустив его однопоточным, это покажет.) – Inspired

+0

Да, я подозреваю, что это проблема. Вот почему я добавляю блокировки в свой код – MistyD