如果函数没有返回,调用堆栈是否会泄漏内存?

问题描述 投票:0回答:2

我不确定这是什么语言,但在PHP中,如果某些函数永远不会返回,你可以在调用堆栈中泄漏内存吗?

例如,假设你有一个带有redirect()(或C语言中的gotos)语句的长函数,语言或环境如何知道删除堆栈的那个帧?是否有一个方法用于确定堆栈帧永远不会返回?

php memory-management memory-leaks stack-trace
2个回答
0
投票

如果你的功能在某些情况下没有返回任何东西,那么这对我来说就像一个糟糕的设计问题。并且不会因为没有返回任何内容而导致任何内存泄漏。

无论函数的返回值是否最终被使用,您应该总是有一个返回某些东西的路径(null,false或任何值)。或者你永远不会返回任何东西......在这种情况下,你的函数将更像是一种方法或程序,就像其他编程语言所指的那样。

如果您正在使用的函数中存在内存泄漏,则需要仔细检查函数的代码以查看可能导致泄漏的原因。


0
投票

这个问题由Memory leak on the stack回答注意:在我发布这个问题之前我确实遇到过这个问题但是在做更多研究之前我不明白答案。

Tl; Dr:PHP为每个页面维护一个堆栈。在C / C ++中,“自动持续时间”存储由编译器自动清理,告诉操作系统在程序执行超出这些分配范围时删除自动持续时间分配。

所以我猜编译器可以检测导致函数不返回的执行路径,并且“标记”(?)这些路径作为移出范围的方式与返回被标记为移出范围的方式相同。

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

© www.soinside.com 2019 - 2024. All rights reserved.