ADDR2LINE дает номер строки, в которой произошел сбой, а не следующий.Попробуйте добавить этот код рядом с main (), чтобы получить обратную трассировку последних адресов и передать их на addr2line .. посмотрите, что вы получите.
void sig_segv(int signo)
{
// Generate backtrace
void *addresses[40];
char **strings;
int c = backtrace(addresses, 40);
strings = backtrace_symbols(addresses,c);
printf("backtrace returned: %d\n", c);
for (int i = 0; i < c; i++) {
std::cout << strings[i] << std::endl;
}
exit(1);
}
внутри main ()
signal(SIGSEGV, sig_segv);
Единственная правильная причина / объяснение этого - да, это происходит сбой при свободной функции.Но при возвращаемом значении и, следовательно, это означает конец строки 82 и начало строки 83.