Это утечка памяти, или ограничение на вызовы функций, или что? - PullRequest
1 голос
/ 21 августа 2011

Я пишу программу на C, которая использует множество рекурсивных функций.Я также использую динамический список для хранения некоторых данных при повторении.Я реализовал функцию Push для отправки данных в список.

После нескольких вызовов функции push "> 17 000 раз" я получаю следующую ошибку:

Необработанное исключение при 0x77963c47 в Prob - Cap CE.exe: 0xC00000FD: Переполнение стека.
at return HeapAlloc(_crtheap, 0, size ? size : 1);, который вызывается из stack->listNode = malloc(sizeof(struct Node)); в функции Push.

Я открыл диспетчер задач и обнаружил, что у меня все еще много свободной памяти.Поэтому я полагаю, что это не проблема утечки памяти.

Существуют ли ограничения на то, сколько я могу добавить в список или сколько раз я могу вызывать функцию?

Ответы [ 3 ]

9 голосов
/ 21 августа 2011

Размер стека, выделенного для процесса, фиксирован.Таким образом, даже если в системе достаточно памяти, вы можете переполнить стек .

Более того, сам процесс обычно имеет достаточно памяти.Просто стек довольно маленький.

5 голосов
/ 21 августа 2011

"> 17 000 раз" - это не "несколько". Это кровавые грузы.

Вы не можете ожидать, что ваш стек будет содержать 17 000 кадров (и сколько он может удерживать зависит от реализации, а также зависит от того, сколько данных содержится в каждом кадре).

Вместо этого используйте итерацию.

2 голосов
/ 21 августа 2011

Что ж, будут ограничения, например, рекурсия может доходить до стековой памяти, выделенной для вашего приложения.Поскольку вы получаете переполнение стека, похоже, что это, вероятно, проблема.

См. Изменение размера стека для приложения C ++ в Linux во время компиляции с компилятором GNU для получения дополнительной информации оизменить размер стека.Если вы не можете заставить его работать правильно даже с огромным стеком, то, вероятно, вам придется провести некоторые оптимизации, чтобы уменьшить объем используемой памяти или ограничить рекурсии.

Вы можете попробовать переместить некоторые из ваших переменных стека в кучу, выделяя их, а не просто делать локальные объявления, просто как первая идея.Если бы вы могли опубликовать некоторый код относительно того, как выглядят ваши рекурсивные функции, мы могли бы дать предложения.Вероятное решение ваших проблем - просто преобразовать ваши функции из рекурсии в циклы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...