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

}

รหัส segfaults ที่บรรทัด "ฟรี (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 ทุกตัวที่ฉันทำในโค้ด

นอกจากนี้ยังพบว่าค่าตัวชี้สำหรับExecution_timeเหมือนกันก่อนที่จะเกิดปัญหาที่ free() โดยใช้ gdb

ลองใช้ valgrind แต่ก็ไม่ได้ช่วยอะไรเนื่องจากโปรแกรมมีข้อผิดพลาด

อาจเกิดปัญหาอะไรที่นี่


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== ที่ 0x80CF291: tivxBamCreateHandleSingleNode ==7406== โปรแกรมของคุณเพิ่งพยายามดำเนินการคำสั่งที่ Valgrind ==7406== ไม่รู้จัก   -  person M.A.    schedule 20.09.2018
comment
ขอบคุณ Jeremy คำแนะนำของคุณได้ผล! ขอบคุณ pm100!   -  person M.A.    schedule 20.09.2018


คำตอบ (1)


ปัญหาทั้งหมดคือใน malloc ฉันแคสต์มันผิดประเภท

สำหรับบัฟเฟอร์ฉันได้ทำการ malloc มันเป็น

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

มันควรจะเป็น

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

buffer เป็นประเภทโครงสร้างในโค้ดของฉัน

มันแปลกมากที่มันล้มเหลวในลักษณะที่ไม่สามารถค้นหาได้จากข้อความแสดงข้อผิดพลาด

ขอบคุณเจเรมี! และ pm100

person M.A.    schedule 19.09.2018