Может ли стек вызовов вызвать утечку памяти, если функции не возвращаются? - PullRequest
0 голосов
/ 28 марта 2019

Я не уверен, насколько это зависит от языка, но, в частности, в PHP, вы можете потерять память в стеке вызовов, если некоторые функции никогда не вернутся?

Например, предположим, что у вас есть длинная функция с оператором (ами) redirect () (или gotos in C), как язык или среда узнают, что нужно удалить этот кадр стека?Есть ли метод, который используется для определения, что кадр стека никогда не будет возвращен?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

На этот вопрос ответил Утечка памяти в стеке Замечания: Я сталкивался с этим вопросом до того, как опубликовал этот вопрос, но я не понимал ответов, пока не провел больше исследований.

Tl; Dr: PHP поддерживает стек для каждой страницы. В C / C ++ «автоматическая продолжительность» хранилища автоматически очищается компилятором, который сообщает операционной системе, что нужно удалять автоматические распределения продолжительности, когда выполнение программы выходит за рамки этих распределений.

Таким образом, я предполагаю, что компилятор может обнаружить пути выполнения, которые приводят к тому, что функция не возвращает, а также «помечает» (?) Эти пути как выходящие из области действия так же, как возвращаемые помечаются как выходящие из области видимости.

https://en.cppreference.com/w/cpp/language/storage_duration

0 голосов
/ 28 марта 2019

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

Независимо от того, используется ли возвращаемое значение вашей функции или нет, у вас всегда должен быть путь, который возвращает что-то (null, false или любое значение). Или вы никогда не могли бы ничего вернуть ... в этом случае ваша функция будет больше похожа на метод или процедуру, как к ней относятся другие языки программирования.

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

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