我正在生产一些使用%alloc
和dealloc
分配内存的 RPGLE 代码。程序员应该能够确保不会导致内存泄漏,但我担心如果他们不这样做会发生什么。
我的问题是:如果程序员搞砸了并且有内存泄漏,那么什么时候可以回收这些内存?是程序离开内存时还是作业完成时?
我正在生产一些使用%alloc
和dealloc
分配内存的 RPGLE 代码。程序员应该能够确保不会导致内存泄漏,但我担心如果他们不这样做会发生什么。
我的问题是:如果程序员搞砸了并且有内存泄漏,那么什么时候可以回收这些内存?是程序离开内存时还是作业完成时?
来自 ILE RPG 程序员参考指南:
当激活组结束时,存储被隐式释放。设置 LR 不会释放模块分配的任何堆存储,但任何指向堆存储的指针都将丢失。
如果您的 RPG 程序在其自己的激活组中,那么程序结束时将释放内存。当然,当您的工作结束时,您的激活组也会结束。因此,结束作业将始终清理分配的任何内存。
听起来您是从 C/C++ 背景接近 RPG。我已经用 RPG 编程大约 8 年了,只有少数几次不得不使用 %alloc() BIF。
话虽如此,如果您使用的是新的激活组,那应该没问题。如果您使用的是命名激活组并且您没有发出 RCLACTGRP 命令,或者您使用的是默认激活组,您可能会遇到问题。
确实,您必须研究激活组的机制。内存泄漏可能会发生,但不会对机器造成任何损害(我喜欢 as400)。但是您可能会损害您 iSeries 作业中的其他程序(注意:如果您不是 as400 背景,则必须阅读有关 as400 作业机制的信息)。
如果您从自己管理工作中的激活组开始(当然是在程序中),您可以创建单独的内存区域。它需要一些开销(您必须为组命名),但是您拥有一个安全的环境,您可以在其中强大的东西。
我不熟悉那些内置功能,但通常在工作结束时一切都会被清理干净(或者如果交互,用户会注销)。如果您找不到答案,我可以将您指向另一个社区,如果您的答案可能已知的话。
现在碰巧看到这个博客,已经很晚了,但谁知道那里的其他人可能仍然觉得这很有用。
%alloc,dealloc 使用作业的默认堆,所以当作业结束时它会被清理。
还有另一种类型的堆,您可以通过 CEE API 以编程方式使用它,它使用用户定义的堆——我认为这是您需要以编程方式管理或清理的堆,否则我认为它可能会导致内存泄漏。