Segfaults при попытке освободить указатель

у меня такой код

void find_groupings ()

  int *bandwidths;
  int *execution_time;

  bandwidths = (int *)malloc(sizeof(int)*node_count); // node_count is glbl
  execution_time = (int *)malloc(sizeof(int)*node_count);
  //other mallocs, other code etc

  while (condition) {
    // lot of code
    find_bandwidths(bandwidths);
    find_execution_time(execution_time);
    //lot of code
  }

  free(bandwidths);
  free(execution_time);

}

ошибки сегментации кода в строке "free(execution_time);"

Thread 1 "vx_tutorial_exe" received signal SIGSEGV, Segmentation fault.
0xf7dd0cd9 in _int_free (av=0xf7f15780 <main_arena>, p=<optimized out>, have_lock=0) at malloc.c:4005
4005    malloc.c: No such file or directory.

Я могу гарантировать, что «execution_time» не выходит за пределы внутри find_execution_time(). Я считаю, что освобождаю каждый malloc, который я делаю в коде.

Также обнаружено, что значение указателя для execute_time одинаково непосредственно перед сбоем в free() с использованием gdb.

пробовал valgrind, но это не помогает, так как программа segfaults

В чем здесь может быть проблема?


person M.A.    schedule 19.09.2018    source источник
comment
valgrind должен помочь вам. Очевидно, вы испортили свою кучу в битах other code. Или, может быть, ваши mallocs терпят неудачу. Хотя бы проверить на ноль   -  person pm100    schedule 20.09.2018
comment
Согласен, что куча была каким-то образом повреждена, и free() дает сбой, потому что сталкивается с поврежденными метаданными кучи. Если valgrind не помогает, другое, что вы можете сделать, это начать временно #ifdef'ировать различные части кода и перезапустить программу, чтобы посмотреть, исчезнет ли сбой. В конце концов вы можете сузить его до того места, где подозрительное подмножество кода достаточно мало, чтобы ошибка стала очевидной.   -  person Jeremy Friesner    schedule 20.09.2018
comment
Благодарю вас! Не могли бы вы рассказать мне, как использовать valgrind для этого. вот ответ, который я получаю: vex x86->IR: байты необработанной инструкции: 0xC5 0xF8 0x10 0x83 ==7406== valgrind: нераспознанная инструкция по адресу 0x80cf291. ==7406== at 0x80CF291: tivxBamCreateHandleSingleNode ==7406== Ваша программа только что пыталась выполнить инструкцию, которую Valgrind ==7406== не распознал.   -  person M.A.    schedule 20.09.2018
comment
Спасибо, Джереми, твой совет сработал! Спасибо pm100!   -  person M.A.    schedule 20.09.2018


Ответы (1)


вся проблема была в том, что в malloc я использовал неправильный тип

для буферов я выделил его как

buffers  = (int *)malloc(sizeof(int)*node_count);

Это должно было быть

buffers  = (buffer *)malloc(sizeof(buffer)*node_count);

буфер - это тип структуры в моем коде.

Это так странно, что он разбился таким образом, что это невозможно выяснить на основе сообщений об ошибках.

Спасибо, Джереми! и 100 часов

person M.A.    schedule 19.09.2018