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