Ошибка сегментации, вызывающая std :: map :: clear - PullRequest
4 голосов
/ 26 июля 2011

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

void foo(..., std::map<MyClass*, double> & x) {
if ( !x.empty() ) x.clear();
...
}

Class A {
private:
map<MyClass*, double> _N;
public:
void f(...) {
foo(..., _N);
...
}
};

//in main routine, the function is called in a loop
A a;
while(...) {
a.f(...);
}

Используя gdb, я прикрепил ошибку к строке, вызывающей функцию clear (), она показывает ошибку «двойное освобождение или повреждение», и программа прерывает вызов c ++ / 4.1.2 / ext / new_allocator.h: 94 delete (__P), который дополнительно вызывает free () из библиотеки gnu /lib64/libc.so.6. Но поскольку элементы на карте не выделяются новыми, почему он все еще вызывает free (), чтобы очистить его. Буду очень признателен за ваши комментарии. Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Учитывая, что карта принадлежит другому объекту, подозрительно звучит, что объект-владелец карты уже был удален при вызове очистки.

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

1 голос
/ 26 июля 2011

Код выглядит хорошо для меня. По крайней мере, с ограниченным контекстом, который вы предоставили. Обычно, когда я сталкиваюсь с подобными проблемами, я просто запускаю инструмент memcheck valgrind, чтобы найти место, где произошло первое «удаление». Если вы знаете, что эти проблемы можно решить довольно просто.

...