доступ к элементу boost sparse_matrix, кажется, останавливает программу

У меня есть странная ошибка, о которой я надеюсь, что более опытный программист может что-то понять. Я использую разреженные матрицы boost ublas, в частности mapped_matrix, и периодически возникает ошибка, которая возникает в конечном итоге, но не на начальных этапах программы. Это большая программа, поэтому я не могу опубликовать весь код, но основная идея заключается в том, что я вызываю функцию, принадлежащую определенному классу:

bool MyClass::get_cell(unsigned int i, unsigned int j) const
{
    return c(i,j);
}

Переменная c определена как член класса

boost::numeric::ublas::mapped_matrix<bool> c;

При возникновении ошибки программа как бы останавливается (но не вылетает). При отладке с помощью Eclipse я вижу, что программа входит в код boost mapped_matrix и переходит на несколько уровней вниз в std::map, std::_Rb_tree и std::less. Кроме того, программа иногда приводит к std::map, std::_Rb_tree и std::_Select1st. Пока код выполняется и активная строка, что находится в памяти, изменяется в _Rb_tree, кажется, что выполнение никогда не возвращается на уровень std::map. Строка в std::map, на которой застряла программа, является возвратом следующей функции.

const_iterator
find(const key_type& __x) const
{ return _M_t.find(__x); }

Мне кажется, что в матрице c есть какой-то элемент, который программа ищет, но каким-то образом базовый механизм хранения «потерял его». Однако я не уверен, почему и как это исправить. Это также может быть совершенно не так.

Любая помощь, которую вы можете предоставить, будет принята с благодарностью. Если я не включил правильную информацию в этот вопрос, сообщите мне, что мне не хватает. Спасибо.


person RandomGuy    schedule 22.08.2009    source источник


Ответы (2)


Некоторые вещи, чтобы попытаться отладить код (не обязательно постоянные изменения):

  • Измените bool на int в типе матрицы для c, чтобы увидеть, ожидают ли матрица числовые типы.
  • Измените тип матрицы на другой с похожим интерфейсом, возможно, старый добрый matrix.
  • Valgrind приложение (если вы используете Linux), чтобы убедиться, что вы не портите память.

Если это не поможет, вы можете попробовать вызывать get_cell каждый раз, когда изменяете матрицу, чтобы узнать, что может быть причиной проблемы.

В противном случае вам, возможно, придется попытаться уменьшить проблему до гораздо меньшего подмножества кода, который вы можете опубликовать здесь.

Может помочь, если вы сообщите нам, какой компилятор и ОС вы используете.

person jon-hanson    schedule 22.08.2009
comment
Спасибо вам за ваши предложения. Я попытался перейти с bool на int, и возникла та же проблема. Я перешел на простую матрицу, и проблема исчезла, но она слишком медленная, чтобы ее можно было использовать без использования разреженной матрицы. Я также пытался вызвать get_cell, но есть много мест, где матрица изменена, и я не уверен, что нашел их все. К сожалению, мне пришлось использовать обходной путь и на некоторое время отложить эту проблему на второй план. Спасибо за ваши предложения, и если я смогу определить проблему позже, я опубликую ее. - person RandomGuy; 25.08.2009
comment
Поиск утечки памяти с помощью valgrind решил проблему. Спасибо за помощь. - person RandomGuy; 01.09.2009

Является ли это частью многопоточной программы?

Я спрашиваю, потому что обычно, когда я вижу проблемы в STL, это заканчивается проблемой несинхронизированного доступа.

person Managu    schedule 22.08.2009
comment
Сначала я пытался использовать многопоточность, но та же проблема возникает, когда программа запускается в одном потоке выполнения. - person RandomGuy; 22.08.2009