Примерно раз в три раза, когда я запускаю свою программу, malloc сообщает об ошибке двойного освобождения; например,
myprogram(703,0xb06d9000) malloc: *** error for object 0x17dd0240: double free
*** set a breakpoint in malloc_error_break to debug
Я запускал один и тот же код через valgrind более десятка раз, но он никогда не сообщает о двойном освобождении.
Я пропустил код через gdb с точкой останова на malloc_error_break и (при возникновении ошибки) об ошибке всегда сообщается в стандартной библиотечной функции c ++. Я изолировал родительскую функцию и запустил ее в тестовом модуле, но без ошибок.
Я думаю, что родительская функция / стандартная библиотека c ++ не виновата, она просто освобождает то, что выделено, но освобождается какая-то другая функция в родительской программе.
Я пытался посмотреть, какой объект освобожден дважды, но мои навыки работы с GDB не позволяют найти первый объект, который был освобожден. Пожалуйста, помогите мне найти, какой объект вызвал первую бесплатную и, кроме того, любую помощь, почему моя программа генерирует эту ошибку. Спасибо.
Родительская функция сводится к:
int i;
double px, py;
int start, finish;
std::string comment;
std::vector<double> x, y;
std::fstream myfile;
myfile.open("filename.txt", std::ios_base::in);
// Read header
std::getline(myfile, comment);
// Read data
while(!myfile.eof())
{
myfile >> comment >> start >> comment >> finish;
for(i = 0; i <= finish-start; i++)
{
myfile >> px >> py; // double free here
x.push_back(px);
y.push_back(py);
}
}
EDIT:
Мой файл данных выглядит примерно так:
Comment: My Data
start 33 end 36
10.2 139.0076
9.22616 141.584
8.62802 141.083
8.87098 141.813
start 33 end 35
300.354 405
301.698 404.029
303.369 403.953
start 33 end 35
336.201 148.07
334.616 147.243
334.735 146.09
Обратный след от GDB
(gdb) backtrace
#0 0x93c2d4a9 in malloc_error_break ()
#1 0x93c28497 in szone_error ()
#2 0x93b52503 in szone_free ()
#3 0x93b5236d in free ()
#4 0x93b51f24 in localeconv_l ()
#5 0x93c18163 in strtod_l$UNIX2003 ()
#6 0x93c192e0 in strtod$UNIX2003 ()
#7 0x919b76e8 in std::__convert_to_v<double> ()
#8 0x919983cf in std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::do_get ()
#9 0x91991671 in std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::get ()
#10 0x9198d2dc in std::istream::operator>> ()
Просто повторюсь, мне нужна помощь, чтобы найти, какой объект был освобожден в первый раз, я не очень заинтересован в рефакторинге своего кода для этой функции - что, я не думаю, вызывает проблему; если только вы не найдете в нем что-то катастрофическое.
РЕДАКТИРОВАТЬ: Изменен пример кода.