Segfault saat mencoba membebaskan penunjuk

Saya punya kode seperti ini

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);

}

kode segfault pada baris "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.

Saya dapat menjamin bahwa "execution_time" tidak keluar batas di dalam find_execution_time() Saya yakin saya membebaskan setiap malloc yang saya lakukan dalam kode

Ditemukan juga bahwa nilai penunjuk untuk waktu_eksekusi sama sebelum mogok di free() menggunakan gdb

mencoba valgrind tetapi, itu tidak membantu karena programnya segfault

Apa masalahnya di sini?


person M.A.    schedule 19.09.2018    source sumber
comment
valgrind akan membantu Anda. Jelas Anda telah membuang tumpukan Anda dalam other code bit. Atau mungkin mallocs Anda gagal. Setidaknya tes untuk nol   -  person pm100    schedule 20.09.2018
comment
Setuju bahwa heap telah rusak, dan free() mogok karena menemukan metadata heap yang rusak. Jika valgrind tidak membantu, hal lain yang dapat Anda lakukan adalah mulai #ifdef sementara mengeluarkan berbagai bagian kode dan menjalankan kembali program untuk melihat apakah kerusakannya hilang. Pada akhirnya Anda dapat mempersempitnya hingga subset kode yang dicurigai cukup kecil sehingga bug akan terlihat jelas.   -  person Jeremy Friesner    schedule 20.09.2018
comment
Terima kasih! Bisakah Anda memberi tahu saya cara menggunakan valgrind untuk ini. ini respon yang saya dapatkan vex x86-›IR: byte instruksi tidak tertangani: 0xC5 0xF8 0x10 0x83 ==7406== valgrind: Instruksi tidak dikenal di alamat 0x80cf291. ==7406== di 0x80CF291: tivxBamCreateHandleSingleNode ==7406== Program Anda baru saja mencoba menjalankan instruksi yang tidak dikenali oleh Valgrind ==7406==.   -  person M.A.    schedule 20.09.2018
comment
Terima kasih Jeremy, saran Anda berhasil! Terima kasih pm100!   -  person M.A.    schedule 20.09.2018


Jawaban (1)


masalahnya adalah, di malloc saya telah meng-castnya dengan tipe yang salah

untuk buffer saya telah memilihnya sebagai

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

Seharusnya begitu

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

buffer adalah tipe struktur dalam kode saya.

Aneh sekali karena crash sedemikian rupa sehingga tidak mungkin diketahui berdasarkan pesan kesalahan.

Terima kasih Jeremy! dan pm100

person M.A.    schedule 19.09.2018