C ++, определяющий два мультикарты, вызывает сбой программы - PullRequest
2 голосов
/ 13 июля 2010

Это совершенно мистифицирует меня. У меня в объявлении класса две строки:

std::multimap<int, int> commands;
std::multimap<std::string, std::string> config;

Код компилируется без проблем, но когда я его запускаю, я получаю следующую ошибку:

*** glibc detected *** ./antares: free(): invalid pointer: 0xb5ac1b64 ***

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

Это меня поставило в тупик, поэтому я был бы признателен за любую помощь, которую вы можете оказать. Wyatt

РЕДАКТИРОВАТЬ: Я не предполагаю, что есть проблема с STL, это был только я немного бойкий. Я знаю, что ошибка в моем коде, что я хочу знать - что может быть неправильным в том, что объявление переменной, на которую нет ссылок, приведет к ее аварийному завершению? Почему это вообще повлияет на мой код?

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

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

Вы правы, предполагая, что проблема не в GCC или STL.Однако, если карты вызывают ошибки free, ваш другой код, скорее всего, разрушит стек (или уничтожит кучу).Действительно ужасная ошибка, чтобы преследовать.Хуже всего в разрушении стека является то, что ломающийся объект не является объектом с ошибкой.

Вот несколько советов по отладке.

  • Запустите приложение под valgrind .
  • определить _GLIBCXX_DEBUG для включения отладки stl
  • добавить MALLOC_CHECK_=1 в качестве переменной среды.Это даст вам лучшие сообщения об ошибках malloc.Подробнее здесь .
  • В редких случаях мне удавалось добавить часы с памятью в место, которое будет разбито.Но редко можно предсказать, где произойдет удар.
2 голосов
/ 13 июля 2010

Вы правы: сбой не из этих двух строк - они просто делают его видимым.

Вот как диагностировать эту проблему:

  • сначала оставьте переменные заданными (вызовите сбой вашей программы)

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

  • в-третьих (если у вас есть область, которая при отключении останавливает сбой), включите ее части, пока сбой не случится снова.

Редактировать : Я бы сказал, что ваша проблема с кодом, который содержит два ваших мультикарта (отсутствует конструктор копирования или оператор присваивания или что-то в этом роде). Это просто дикое предположение, так что не стоит на этом останавливаться.

...