arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
Есть тут спецы по сям?) Кусок кода: int *num_mol_agl; for (i=from; i<to+1; i++) { /* здесь рабочий блок, объявление каких то переменный, в т.ч. и num_mol */ if (i == from) { agl = (int *) malloc (num_mol * num_mol * sizeof (int)); connect = (int *) malloc (num_mol * num_mol * sizeof (int)); num_mol_agl = (int *) malloc (num_mol * sizeof (int)); stat = (int *) malloc (num_mol * sizeof (int)); stat_all = (int *) malloc (num_mol * sizeof (int)); } /* продолжение */ } num_mol_agl[num_mol-1] = num_mol; printf ("%i - %i\n", num_mol-1, num_mol_agl[num_mol-1]); // free memory free (agl); free (connect); free (coords); free (crit); free (label_mol); // memory crash here free (num_mol_agl); // free (stat); // free (stat_all); free (true_label_mol); free (type_atoms); return 0; Теперь описание проблемы: Программа рабочая на 146%. Но крашится в конце на освобождении памяти для массивов (для любого из) num_mol_agl, stat и stat_all (те, что объявляются самые последние). Обращение к этим массивам (в т.ч. непосредственно перед free) осуществляется нормально. Но крашится( ЧЯДНТ? PS лог ошибки PPS весь main (многабукаф) |
kurych |
|
Темы:
0
Сообщения:
1394
Участник с: 06 ноября 2011
|
Так как уже поздновато, давайте для начала с двумя очевидными возможными причинами разберемся: 1) Немного некрасиво выглядит блок выделения памяти внутри цикла for, но это больше касается стиля программирования, а не ошибка. Гораздо хуже, что не проверяется возвращаемое значение функции malloc, что бы убедиться, что память действительно выделена. То, что потом можно обращаться к членам массива, еще ни о чем не говорит. 2) В строке printf ("%i - %i\n", num_mol-1, num_mol_agl[num_mol]); |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
kurych1) согласен, что не красиво, но num_mol, необходимый для выделения памяти, определяется только в первой процедуре цикла (дальше он каждый раз переприсваивается, хотя числовое значение не изменяется). Хотя, конечно, можно ресайз сделать (в ближайшее время так и сделаю). В цикле на тестовых данных программа находится 1 раз (to==from). Насчет проверки, если честно, я плохо понял, что подразумевается. (num_mol_agl != NULL) возвращает true. Кстати, если выделить память под массив в самом начале (после определения переменных), то все равно крашится: num_mol_agl = (int *) malloc (250 * sizeof (int)); kurych2) извиняюсь, это было специально сделано таким образом (мне было любопытно, что изменится, если я вылезу за границу массива). При копировании сюда забыл исправить. Подредактирую первый пост, чтобы не вводить в заблуждение Специально вернул назад, попробовал. Сейчас там вот так num_mol_agl[num_mol-1] = num_mol; printf ("%i - %i\n", num_mol-1, num_mol_agl[num_mol-1]); 249 - 250 /* текст ошибки */ Еще попробовал каждый раз в начале цикла выделять память (как показано выше в этом посте), в конце очищать - все равно краш (все другие упоминания, есно были убраны). |
sirocco |
|
Темы:
29
Сообщения:
2501
Участник с: 25 июля 2007
|
Попробовать через valgrind? А вообще - программа может крашиться из-за более раннего кода. |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
изменил код с выделением памяти в начале программы:num_mol_agl = (int *) malloc (2 * sizeof (int)); /* */ num_mol_agl = (int *) realloc (num_mol_agl, num_mol * sizeof (int)); if (num_mol_agl == NULL) { printf ("Memory error (error code: 17)\n"); return 17; } Проверил еще раз функции, в которых используется эта переменная - только либо присваивание, либо вызов значения |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
siroccoче т там много букв, мне страшно) valgrind -q --log-file=valgrind.log ./statgen -i oct-clb -s 1,1 -c 35.747,35.747,35.747 -a 1 -r 0-0:4.55 -o test.dat -l test.log -q (verbose не помещается =)) видимо, интересует этот кусок: ==4529== Syscall param write(buf) points to uninitialised byte(s) ==4529== at 0x520A1D0: __write_nocancel (in /usr/lib/libc-2.17.so) ==4529== by 0x51A5352: _IO_file_write@@GLIBC_2.2.5 (in /usr/lib/libc-2.17.so) ==4529== by 0x51A4A12: new_do_write (in /usr/lib/libc-2.17.so) ==4529== by 0x51A6184: _IO_do_write@@GLIBC_2.2.5 (in /usr/lib/libc-2.17.so) ==4529== by 0x51A5B1F: _IO_file_close_it@@GLIBC_2.2.5 (in /usr/lib/libc-2.17.so) ==4529== by 0x519A567: fclose@@GLIBC_2.2.5 (in /usr/lib/libc-2.17.so) ==4529== by 0x404E82: summary_statistic (in /home/arcanis/Documents/github/moldyn/stat_new/statgen) ==4529== by 0x4020DA: main (in /home/arcanis/Documents/github/moldyn/stat_new/statgen) ==4529== Address 0x4023089 is not stack'd, malloc'd or (recently) free'd int summary_statistic (char *filename, int step, int num_mol, const int *type_agl, const int *stat_all) До освобождения памяти стоит как раз эта функция, которая печатает в файл. она прорабатывается до конца без ошибок, т.е. падает именно на освобождении памяти. И именно конкретных 3х массивов (неважно где освобождать память). |
kurych |
|
Темы:
0
Сообщения:
1394
Участник с: 06 ноября 2011
|
Еще эта строка смущает:error = reading_coords (filename, type_inter, label_atom, cell, &num_mol, &num_atoms, true_label_mol, label_mol, type_atoms, coords); |
sirocco |
|
Темы:
29
Сообщения:
2501
Участник с: 25 июля 2007
|
arcanisПрограмма собрана, как советуют, с -g -O0? arcanisИнтересно, а если забить на освобождение памяти? Вроде при завершении программы она должна автоматом освобождаться? Вариант - попробовать собрать clang-ом с Address Sanitizer. На stackoverflow встречаются подобные проблемы. |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
kurychтак и задумано - он определяется именно в этой функции (вместе с большинством аргументов, которые передаются ссылками). То что он может быть изменен - да (в теории), но не задумано программой (и входными данными) априори. К тому же, как я говорил выше, для теста используется только 1 проход по циклу. siroccoмм, неа. Пересобрал, вроде вывод не изменился. Ну бОльшая часть ругани там на вызовы типа: a = atoi (&string[n]); siroccoв этом плане да, я уже думал - все рабочее вроде как, утечки памяти быть не может здесь. Но вроде как уже самому интересно, что там не так. За ссылку спасибо, видел уже подобное, правда решений (объяснений) внятных так и не увидел |
kurych |
|
Темы:
0
Сообщения:
1394
Участник с: 06 ноября 2011
|
Если временно собрать программу с закомментированным вызовом summary_statistic, ошибка все равно вылетает? |