据我所知,如果你不清理堆栈,以后会出现问题,例如内存泄漏,等等,我想知道什么是确保堆栈清理的最佳方法?
是否应该通过调用程序或被调用的程序进行清理?
答案 0 :(得分:1)
由calling convention定义。例如,cdecl
调用者清除stdcall
- 被调用者的堆栈。
还没有正确清理堆栈内存泄漏。它会开始引起问题,你甚至都不会注意到。
答案 1 :(得分:1)
实际上没有清理堆栈!堆栈是临时程序存储器。您必须只更正堆栈指针寄存器和基址指针寄存器(取决于调用约定)。堆栈内存应保持不变,并在下次使用时被覆盖!
答案 2 :(得分:0)
作为程序的调用者,您需要知道如何处理堆栈以及如何传递参数。被叫方会期望在通话之前设置某些事情,并且可能希望您在之后做一些事情。该协议称为“召集协议”。 CPU架构将具有一系列调用约定。
两个公共场所是' cdecl'和' pascal'。
在' cdecl'你将参数推入堆栈,进行调用,然后关闭项目。
在' pascal'被调用者负责在返回之前清理堆栈。
请参阅:http://en.wikipedia.org/wiki/Calling_convention http://en.wikipedia.org/wiki/X86_calling_conventions
答案 3 :(得分:0)
最好的办法是与其他人或计划保持一致;如果您正在使用库,或使用BY库,请确保您符合他们的期望。
如果您有完全控制权,请选择一项政策&全面坚持下去。你甚至可以将工作分开:让每个人(来电者和被叫者)负责清理它对堆栈所做的更改。
答案 4 :(得分:0)
某些约定每个函数需要一个入口和一个出口点。因此,最后将清洁程序放在一起很容易。
但实际上清理堆栈并不一定是最好的,而不是随机化内容或在那里放置一些sentinel(浮点/双重编码为NaN,或指针明显在分配区域之外)。 )使用此方法,您可以比为每个不初始化其参数的函数强制清除零更快地检测未定义的行为。你也可以想让你的malloc / free来检测这些哨兵。