gpt4 book ai didi

c++ - 使用 Indy TIdTCPServer 的 Windows 服务(CodeGear C++ XE5)中的内存泄漏

转载 作者:行者123 更新时间:2023-11-28 06:48:54 24 4
gpt4 key购买 nike

我有 CodeGear C++ Builder XE5。使用 TIdTCPServer 创建的服务器,效果很好。但是,服务使用的内存正在增长。我终于设法包含完整版的 FastMM4 内存管理器,并且在摆弄选项后我发现了内存泄漏的确认:

13 - 20 bytes: TIdThreadSafeInteger x 1
21 - 36 bytes: TIdCriticalSection x 2, Unknown x 1
53 - 68 bytes: UnicodeString x 1
85 - 100 bytes: Unknown x 21
149 - 164 bytes: Unknown x 21
181 - 212 bytes: Unknown x 2

显然 x1 和 x2 与我无关,但是 x21 泄漏很糟糕,因为这是高度使用的服务 - 每个连接都会泄漏 100 和 164 字节:

更多详细信息状态:

A memory block has been leaked. The size is: 100

This block was allocated by thread 0xD98, and the stack trace (return addresses) at the time was:
8D4743 [Unknown function at @@Zip_int@Finalize]
8D461D [Unknown function at @@Zip_int@Finalize]
8E0F94 [Unknown function at @@Zip_int@Finalize]
8E0F59 [Unknown function at @@Zip_int@Finalize]
8DFADA [Unknown function at @@Zip_int@Finalize]
8DE722 [Unknown function at @@Zip_int@Finalize]
8BF045 [Unknown function at @@Searchfilelist@Finalize]
8C4C90 [Unknown function at @@Searchfilelist@Finalize]
8D6638 [Unknown function at @@Zip_int@Finalize]
775D1C77 [Unknown function at RtlNtStatusToDosErrorNoTeb]
452A45 [@Fastmm4@DebugGetMem$qqri]

The block is currently used for an object of class: Unknown

A memory block has been leaked. The size is: 164

This block was allocated by thread 0x5394, and the stack trace (return addresses) at the time was:
8D4743 [Unknown function at @@Zip_int@Finalize]
8D461D [Unknown function at @@Zip_int@Finalize]
8E0FD9 [Unknown function at @@Zip_int@Finalize]
8E0F59 [Unknown function at @@Zip_int@Finalize]
8DFADA [Unknown function at @@Zip_int@Finalize]
8DE722 [Unknown function at @@Zip_int@Finalize]
8BF045 [Unknown function at @@Searchfilelist@Finalize]
8C4C90 [Unknown function at @@Searchfilelist@Finalize]
8D6638 [Unknown function at @@Zip_int@Finalize]
775D1C77 [Unknown function at RtlNtStatusToDosErrorNoTeb]
452A45 [@Fastmm4@DebugGetMem$qqri]

The block is currently used for an object of class: Unknown

The allocation number is: 125893

此时我卡住了,我不知道这是哪里来的,因为我没有直接打电话Zip_int。谁能指出我正确的方向?

最佳答案

前两个泄漏 - TIdThreadSafeIntegerTIdCriticalSection - 是 Indy 中众所周知的泄漏,仅在应用程序关闭时发生,因为它们是全局对象,有意未释放。我很惊讶地在泄漏报告中看到它们,因为 Indy 将它们注册为 FastMM 作为已知泄漏。

其他的不是 Indy 漏洞。您的代码必须分配您没有释放的东西。 UnicodeString 泄漏可能表明了这一点,因为泄漏 String 的最常见方式是它是否是未释放的类实例的成员。如果泄漏与您的服务器收到的连接数成正比,那么您可能会分配一些东西并将其存储在 TIdContext 中,例如在 OnConnect 事件中,而不是稍后释放,例如在 OnDisconnect 事件中。但是你没有显示你的代码。

我觉得奇怪的是,泄漏似乎是在单元完成期间分配的,而不是在应用程序的正常运行期间分配的,但我不知道为什么会有这么多 Finalize 调用在一起。除非应用程序的堆栈跟踪信息有误。 FastMM 无法报告更有意义的信息,因为这些单元可能未在启用调试信息的情况下编译。您至少有一个由编译器为您的应用程序生成的 .MAP 文件吗?这有助于 FastMM 从内存地址解析函数名称。

关于c++ - 使用 Indy TIdTCPServer 的 Windows 服务(CodeGear C++ XE5)中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24418246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com