修改

开的9年前

关闭3年前

#3135 关闭 缺陷 (固定的)

StdioClose,$STDERR_MERGED内存泄漏

报告人: 杰瓦内格蒙德 所有者: 乔恩
里程碑: 3.3.15.4 组件: AutoIt(自动识别)
版本: 3.3.15.0 严重程度:
关键词: 复写的副本:

描述

通过AutoIt v3.3.15.0在我的机器上运行以下AutoIt代码时,每分钟泄漏几MB内存:

#include<常量.au3>当1$pid=运行(“ping localhost”,“”,@SW_HIDE,$STDERR_MERGED)进程等待($pid)StdioClose($pid)进程关闭($pid)进程等待关闭($pid)WEnd公司

最初在此处报告https://www.autoitscript.com/forum/topic/177671-stdoutread-memory-problem-edit-and-stdioclose/

附件(0)

更改历史记录(13)

评论:1 改变9年前由Jpm提供

如果我理解得很好,你只是错过了正确位置的StdioClos($pid)
正如Jos建议的那样

注释:2 改变9年前作者:jvanegmond

Jpm,问题解决了。然而,AutoIt方法不应泄漏内存。它们应该防止内存泄漏,或者捕获可能泄漏并返回的条件,然后设置@error。否则会造成不必要的混淆,并给最终用户带来我们不希望看到的负担。

在这种特殊情况下,由于问题只发生在定义了$STDERR_MERGED的情况下,我想这可能是StdioClose或ProcessClose内部对该特定情况的疏忽。

注释:3 随访: 改变9年前匿名

同意那里有一个错误。
首先,发布的脚本也是帮助文件所宣传的,它存在内存泄漏,但在注释StdioClose()语句时似乎也存在泄漏。当STDIO用于进程时,可能是ProcessClose()没有清理吗?

乔斯

上次编辑时间9年前作者:Jos(以前的)(差异)

评论:4 答复: 3 改变9年前作者:jvanegmond

回复匿名的:

但在注释StdioClose()语句时,似乎也存在漏洞。当STDIO用于进程时,可能是ProcessClose()没有清理吗?

有趣的是,唯一似乎有效的订单是您在论坛上发布的,您在ProcessWaitClose之后调用StdioClose。任何其他顺序都会泄漏内存。

注释:5 改变9年前作者:Jos

正确或另一个选项是用一个循环替换StdioClose(),该循环读取STDIO缓冲区,直到它读取了所有内容。这也将避免泄漏。

乔斯

注释:6 改变9年前由Jpm提供

对我来说,只有当进程真正关闭时,StdIoClose()才能进行最终清理,以便正常进行清理后才能进行完全清理
进程关闭后,StdOutRead()或StdErrRead(。所以如果你不这样做,StdIoClose()将为你做。

我希望我能理解AutoIt的实现。我把最后的答案留给乔恩

注释:7 改变8年前作者:Valik

JP,文档中明确指出StdioClose()会释放所有资源。不管进程是否关闭,AutoIt都应该在内部关闭句柄并释放所有缓冲区。

我写STDIO代码已经有好几年了,我再也无法访问它了(在我离开项目的几年里,它可能已经改变了)。不过,我知道漏洞可能在哪里。记住,当缓冲区填满子程序时,AutoIt将死锁。我编写的这个特性很有可能总是读取缓冲区并在内部存储数据以防止死锁。我怀疑可能是这个内部缓冲区导致了这个问题。它可能是在每次调用时动态分配的,这在理论上可能会导致工作集中的人为膨胀。

注释:8 改变8年前由Jpm提供

谢谢Valik提供的信息,如果你想我可以PM我,PM你正在考虑的实际代码
干杯

注释:9 改变8年前作者:瓦利克

对不起,JP。我对代码不感兴趣。

注释:10 改变8年前由Jpm提供

无论如何,谢谢Valik提供的信息
干杯

评论:11 改变6年前由Jpm提供

  • 所有者设置为乔恩
  • 状态已从更改新的分配

评论:12 改变4年前由Jpm提供

  • 所有者已从更改乔恩Jpm公司

已将修复发送给Jon

注释:13 改变3年前作者:Jon

  • 里程碑设置为3.3.15.4
  • 所有者已从更改Jpm公司乔恩
  • 分辨率设置为固定的
  • 状态已从更改分配关闭

通过修订修复[12557]版本:3.3.15.4

发表评论的指南:

  • 您不能重新打开票据,但如果您有其他信息需要添加,您仍然可以留下评论。
  • 应就论坛.

有关更多信息,请参阅票务指南的完整版本在这里.

添加注释

修改票据

行动
已关闭所有者仍将是乔恩。
作者


电子邮件地址和用户名可以保存在偏好.

 
注:请参见TracTickets公司有关使用的帮助门票。