2015-02-16 3 views
2

У меня есть следующее объявление для 2D динамического целого связанного списка в Population.cpp:С ++ Glibc обнаружен поврежденный двойной связанный список ошибок C++

sectionProf = new int*[section_count]; //list of professor for each section declaration 

Оно определено в Population.h как:

int ** sectionProf; //list of professor for each section 

затем заполняется из файла как такового, опять же в Population.cpp, позже:

sectionProf[section] = new int[professors + 1]; 
sectionProf[section][0] = professors; 
if (professors > 0) { 
    for (int x = 1; x < professors + 1; ++x) { 
     sectionProf[section][x] = stoi(tokenizedVersion[x + 1]); 
    } 
} 

затем в деструкторе, Я истреблю его следующим образом:

if(sectionProf){ 
    for(int i = 0; i < section_count; ++i){ 
     delete [] sectionProf[i]; 
    } 
    delete [] sectionProf; 
} 

Однако, при исполнении, я получаю следующее сообщение об ошибке:

* glibc detected * ./research_scheduling_backend: corrupted double-linked list: 0x00000000020b78c0 ***

Вот в GdB трассировку (# 17 ссылается на 'Удалить [] sectionProf' строка):

#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:93 
#1 0x00007ffff7085f61 in _L_lock_10611() at malloc.c:5249 
#2 0x00007ffff7083c87 in __GI___libc_malloc (bytes=140737341265696) at malloc.c:2921 
#3 0x00007ffff7de7900 in _dl_map_object_deps (map=0x7ffff7fdd4e0, preloads=<optimized out>, npreloads=<optimized out>, trace_mode=0, open_mode=-2147483648) at dl-deps.c:517 
#4 0x00007ffff7ded8a9 in dl_open_worker (a=0x7fffffffbb00) at dl-open.c:262 
#5 0x00007ffff7de9176 in _dl_catch_error (objname=0x7fffffffbb48, errstring=0x7fffffffbb50, mallocedp=0x7fffffffbb5f, operate=0x7ffff7ded700 <dl_open_worker>, args=0x7fffffffbb00) at dl-error.c:178 
#6 0x00007ffff7ded31a in _dl_open (file=0x7ffff717a858 "libgcc_s.so.1", mode=-2147483647, caller_dlopen=0x7ffff710bea5, nsid=-2, argc=3, argv=<optimized out>, env=0x7fffffffeac8) at dl-open.c:639 
#7 0x00007ffff7131bb2 in do_dlopen (ptr=0x7fffffffbd00) at dl-libc.c:89 
#8 0x00007ffff7de9176 in _dl_catch_error (objname=0x7fffffffbd30, errstring=0x7fffffffbd20, mallocedp=0x7fffffffbd3f, operate=0x7ffff7131b70 <do_dlopen>, args=0x7fffffffbd00) at dl-error.c:178 
#9 0x00007ffff7131c74 in dlerror_run (args=0x7fffffffbd00, operate=0x7ffff7131b70 <do_dlopen>) at dl-libc.c:48 
#10 __GI___libc_dlopen_mode (name=<optimized out>, mode=<optimized out>) at dl-libc.c:165 
#11 0x00007ffff710bea5 in init() at ../sysdeps/x86_64/../ia64/backtrace.c:53 
#12 0x00007ffff6df1400 in pthread_once() at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S:104 
#13 0x00007ffff710bfc4 in __GI___backtrace (array=<optimized out>, size=64) at ../sysdeps/x86_64/../ia64/backtrace.c:104 
#14 0x00007ffff707505f in __libc_message (do_abort=2, fmt=0x7ffff717f560 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:180 
#15 0x00007ffff707f846 in malloc_printerr (action=3, str=0x7ffff717be4c "corrupted double-linked list", ptr=<optimized out>) at malloc.c:5047 
#16 0x00007ffff7080b1b in _int_free (av=0x7ffff73b9720, p=0x627dd0, have_lock=0) at malloc.c:4125 
#17 0x0000000000404b7e in Population::~Population (this=0x7fffffffc910, __in_chrg=<optimized out>) at Population.cpp:91 
#18 0x0000000000403919 in main (argc=3, argv=0x7fffffffeaa8) at Scheduler.cpp:101 

В коде абсолютно нет места в разделе массиваProf, когда-либо измененном. Он используется только для проверки значений. Может кто-нибудь, пожалуйста, скажите мне, почему я могу получить эту ошибку? Я посмотрел повсюду о ошибках с двойными связями glibc, и я понимаю, что это потому, что я каким-то образом искажаю таблицу символов (?) Как-то ...

+0

Вероятно, в цикле 'for',' stoi (tokenizedVersion [x + 1]); 'выполняет не связанный доступ, когда' x = professors' (что в случае, когда 'tokenizedVersion [x + 1]' каким-то образом обращается к ' профессора [x + 1] ') – vsoftco

+0

@vsoftco, я действительно проверял, что он читает в правильных пределах памяти. :/'professors' - это размер строки и сохраняется как первое значение. (следовательно, объявление строки - «профессора + 1». Редактирование: исправленный тег кода. – Sid78669

+0

Вы должны добавить больше кода, особенно цикл, который создает разделы section_prof. Вы проверили, что section_count не переписан между файлом чтения и деструктором? – Johnmph

ответ

3

Для тех, кто приземляется на эту проблему, здесь что не так в моей конкретной проблеме. Я читал значение мусора для индекса раздела, который был вне диапазона (section_count), когда я генерировал массив. То есть, в течение цикла,

sectionProf[section] = new int[professors + 1]; 
sectionProf[section][0] = professors; 
if (professors > 0) { 
    for (int x = 1; x < professors + 1; ++x) { 
     sectionProf[section][x] = stoi(tokenizedVersion[x + 1]); 
    } 
} 

мое значение section не было в диапазоне 0 и section_count, индекс, используемый в цикле удаления. Отсюда почему я причиняю коррупцию памяти.

Урок: Проверьте PEBKAC ошибок, генерируемых во входных файлах.

Смежные вопросы