加速 asio 中的内存泄漏

Memory leaks in boost asio

本文关键字:内存 泄漏 asio 加速      更新时间:2023-10-16

我有客户端/服务器应用程序。 通过 Boost.Asio 实现交互。

我创建了单元测试来检查长时间运行的数据传输。在测试期间检测到内存泄漏。任务管理器向我显示内存使用量不断增长 - 每 10 分钟高达 35MB。测试结束时生成的报告包含以下内容:

Result StandardError:   Detected memory leaks!
Dumping objects ->
{14522} normal block at 0x00E8ADC0, 16 bytes long.
 Data: < _M} Y          > B0 5F 4D 7D F9 59 F2 02 F4 E9 E6 00 CC CC CC CC 
{14012} normal block at 0x00E8B280, 16 bytes long.
 Data: < v              > C0 76 A4 00 94 01 00 00 98 01 00 00 F0 D2 E3 00 
{14011} normal block at 0x00E74B38, 12 bytes long.
 Data: <            > 00 00 00 00 9C 01 00 00 98 01 00 00 
{14007} normal block at 0x00E745F8, 8 bytes long.
 Data: < L      > E0 4C E5 00 00 00 00 00 
{14006} normal block at 0x00E54CB8, 60 bytes long.
 Data: < v          4   > E4 76 A4 00 D0 D3 B0 00 00 00 00 00 34 80 E3 00 
{13724} normal block at 0x00E710F8, 385 bytes long.
 Data: <                > 03 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{13722} normal block at 0x00E85C58, 28 bytes long.
 Data: <  F  _   _      > F2 B6 46 00 B4 5F E3 00 A0 5F E3 00 BC 96 E7 00 
{13720} normal block at 0x00E6F9B8, 80 bytes long.
 Data: <wxF             > 77 78 46 00 FC FF FF FF 00 00 00 00 CC CC CC CC 
{13700} normal block at 0x00E6DFD0, 88 bytes long.
 Data: <                > C8 A4 A4 00 01 00 00 00 01 00 00 00 00 00 00 00 
…
 Data: <`   X    L  > 60 8E E0 00 58 17 E2 00 CD 4C F7 EA 
{153} normal block at 0x00DF0070, 12 bytes long.
 Data: <`        kf > 60 8D E0 00 98 00 E2 00 15 6B 66 0E 
{151} normal block at 0x00DF0038, 12 bytes long.
 Data: <          .g> 20 86 E0 00 E0 FC E1 00 9D B7 2E 67 
{149} normal block at 0x00DF0658, 12 bytes long.
 Data: <        G   > A0 89 E0 00 00 00 00 00 47 01 D5 11 
{147} normal block at 0x00DF0268, 12 bytes long.
 Data: <`           > 60 84 E0 00 A8 F5 E1 00 ED 8C AA BA 
{145} normal block at 0x00DF0230, 12 bytes long.
 Data: <        ' " > 20 84 E0 00 00 11 E2 00 27 B0 22 00 
{143} normal block at 0x00DF0690, 12 bytes long.
 Data: <`   P   KnOQ> 60 88 E0 00 50 04 E2 00 4B 6E 4F 51 
{141} normal block at 0x00DF0540, 12 bytes long.
 Data: <`       >  7> 60 82 E0 00 00 0A E2 00 3E 0D 9E 37 
{139} normal block at 0x00DF0620, 12 bytes long.
 Data: <Pq        1 > 50 71 DF 00 00 00 00 00 E5 DD 31 B5 
{137} normal block at 0x00DF0700, 12 bytes long.
 Data: < q  @      #> 10 71 DF 00 40 FA E1 00 14 8B 0D 23 
{134} normal block at 0x00DF5CE0, 96 bytes long.
 Data: <h    BV  BV     > 68 19 E0 00 D0 42 56 00 E0 42 56 00 88 00 00 00 
{133} normal block at 0x00DF0188, 8 bytes long.
 Data: <       > A0 5C DF 00 00 00 00 00 
{132} normal block at 0x00DF5CA0, 16 bytes long.
 Data: <                > 88 01 DF 00 D8 AA DF 00 20 AC DF 00 20 AC DF 00 
Object dump complete.

我试图通过 boost 的--detect_memory_leaks="allocation number"和在调试模式 _crtBreakAlloc = 1000 的监视窗口中的设置将断点放入提到的内存分配。它不起作用。也许是因为泄漏不是发生在我的代码中,而是发生在提升/OpenSSL 代码中?

我无法弄清楚泄漏发生的位置。我能做什么?

Windows 8, Visual Studio 2015, boost 1.60, OpenSSL 1.0.2g

看看这篇文章,看看一些关于处理Windows内存泄漏的建议技巧。向下滚动,不要只看第一个答案。特别是,可能值得考虑第二个答案所讨论的DEBUG_NEW基于宏观的解决方案。鉴于 boost asio 在很大程度上是仅标头的,即使违规分配来自提升库,这也应该对您有所帮助。

1 部分:来自 Visual Studio 的有关内存泄漏的报告

我正在使用Boost.Asio

通过TLS与服务器通信,即Boost.Asio使用OpenSSL。

似乎 OpenSSL 会自行初始化并且不会在应用程序结束之前清理内存(因为应用程序关闭并且无论如何都会释放内存)。这不是一大块内存(我不知道如何衡量它)。

因此,Visual Studio将该内存视为泄漏。但事实并非如此。

(这是我的假设,也许这种报告的真正原因是其他原因。但我看不出任何其他可能的原因。)

篇二:

在上面的问题中,我询问了数十 Mb 的内存泄漏。这是我的错误代码,导致巨大的内存缓冲区))。

巨大的内存消耗和来自VisualStudio的关于内存泄漏的报告让我相信smth是非常错误的))

缓冲液很容易减小到更小的尺寸。