Ошибка сегментации C ++ в функции binary_function - PullRequest
0 голосов
/ 18 июня 2010

Я использую Visual Studio 2010 Beta 2 (также пробовал с NetBeans), и у меня ошибка сегментации в следующем коде:

// One of the @link s20_3_3_comparisons comparison functors@endlink.
template <class _Tp>
struct less : public binary_function<_Tp, _Tp, bool>
{
  bool
  operator()(const _Tp& __x, const _Tp& __y) const
  { return __x < __y; }                          //this is the problem line
};

Я не знаю, что в моей программеназывает это, но я пытаюсь выяснить.(Я думаю, что это карта) Кто-нибудь знает, что делать, или сталкивался с этим раньше?

Ответы [ 2 ]

6 голосов
/ 18 июня 2010

В этом коде нет ничего плохого; проблема заключается в вашем коде, который его вызывает. (Фактически, поскольку это часть STL, крайне маловероятно, что с этим кодом возникнет проблема.) Вероятно, ему передают недопустимую ссылку из-за освобождения памяти, указателя NULL или подобного.

less используется по умолчанию для std :: map , std :: set и, вероятно, некоторых других контейнеров, о которых я сейчас не думаю, так что вы можете проверить, есть ли у вас контейнеры, такие как те, которые остались с недопустимыми значениями.

(Правда, самый простой подход - это сделать, как сказал Джеймс МакНеллис, - запустить его в отладчике и посмотреть на трассировку стека.)

2 голосов
/ 18 июня 2010

У меня вчера была такая же проблема.

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

Обычно для этого сбоя есть три возможности:

  • другая проблема вызывает повреждение данных, для которых вызывается эта функция
  • еще одна проблема - повреждение стека, вызывающее вызов этой функции, когда она не должна быть
  • любая комбинация из двух указанных выше возможностей.

Чтобы диагностировать это, запустите ваш код в отладчике VS. Когда ваше приложение дает сбой, посмотрите на значения параметров и убедитесь, что трассировка стека, показанная в отладчике, совпадает с трассировкой стека, которую вы должны увидеть (нажмите на каждую запись в трассировке стека и посмотрите, что код вызывает то, что должно ).

...