Здравствуйте, сообщество. Я понимаю, что это, возможно, не самое правильное место для вопроса по программированию, но мне достоверно известно, что здесь сидят более-менее грамотные люди, которые мне действительно могут помочь. И других таких мест мне, увы, знать не довелось.
Я пишу программу на C++ (использую только подмножество синтаксиса языка С99 плюс перегрузку операторов - никаких классов/объектов/потоков). Суть программы сводится к следующему: она берёт "сетку", модифицирует все её значения (шагает), после чего проделывает с полученной сеткой аналогичные операции. И так до тех пор, пока не достигнет какого-нибудь результата. Так вот, я обнаружил, что умудряюсь, похоже, продавить стек. После примерно 20 тысяч шагов программа выдаёт SegFault и завершается. Я посмотрел в gdb бэктрейс и увидел там over20000 фреймов. Собственно, хочется, чтобы кто-то посмотрел и по возможности помог советом: вот отсюда[1] можно скачать архив с последней версией. Собирать надо одним из следующих образов: 1) make test-shock1 2) make test-shock2a 3) make test-shock2b В чём суть: В бэктрейсе множественные вызовы функции make_step, которая вызывается из маршевой функции на каждой итерации. Вот так это примерно происходит: ---------------------------------------- void march (Grid1D grid) { <...> Grid1D newgrid = make_step(grid, tau); march(newgrid); }; ---------------------------------------- А вот как определена сама функция: ---------------------------------------- Grid1D make_step(Grid1D grid, double tau) { Grid1D newgrid = grid_skel(grid); newgrid.iter += 1; newgrid.time += tau; double h = grid.h; double N = grid.N; ConservVars lf; ConservVars rf = count_left_flux(grid,0,tau); for (unsigned int i=0; i<N; i++) { lf = rf; if (i != N-1) rf = count_left_flux(grid,i+1,tau); newgrid.cells[i].vars = grid.cells[i].vars - tau*(rf-lf)/h; }; free(grid.cells); return newgrid; }; ---------------------------------------- Никак не пойму, что ж с ней не так-то: функция была вызвана, отработала, вернула результат. Значит кадр в стеке ей вроде бы уже не нужен. Но он остаётся. Почему? [1] http://git.freehck.ru/cfrolov.git/
pgptHcPWwDcm5.pgp
Description: PGP signature