【问题标题】:C++ memory errors at program exit程序退出时的 C++ 内存错误
【发布时间】:2011-08-20 14:34:04
【问题描述】:

我正在编写一个通过套接字与服务器应用程序通信的客户端应用程序。我目前遇到了应用程序正常运行完成的奇怪行为,但随后我在屏幕上看到了许多类似以下内容的行。

*** glibc detected *** ./sll_client: free(): invalid next size (fast): 0x0000000000787720 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a8f)[0x7f9e9cbb5a8f]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x73)[0x7f9e9cbb98e3]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x39)[0x7f9e9d409019]

======= Memory map: ========

7f9e9d893000-7f9e9d895000 rw-p 00021000 07:00 7473                       /lib/x86_64-linux-    gnu/ld-2.13.so
7fff68119000-7fff6813a000 rw-p 00000000 00:00 0                          [stack]
7fff68167000-7fff68168000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

特定的“glibc”错误几乎每次都不同。

我已经通过 Valgrind 运行了应用程序,几乎没有检测到内存泄漏。那里的那些似乎不会引起任何问题。有这个问题的一般原因吗?我可以发布一些代码,但它超过三千行 C++,这是三周以来第一次出现这个问题。

Valgrind Output

GDB Output

【问题讨论】:

  • 除了内存泄漏之外,valgrind 是否报告了任何其他问题?
  • 我会说它已经正常运行了......它现在显然运行不正常。
  • @Fred:我添加了指向 Valgrind 日志的链接
  • @Ben:有效,但它仍然可以满足我的所有需求。唯一的问题是它在完成工作后会吐出这些额外的消息:)。
  • 我实际上没有太多阅读 valgrind 输出的经验,但我看到了一些“无效读取”和“无效写入”消息。我会看一下 RCFour.cpp,第 71-72 行。我怀疑你那里的指针不好或其他什么。

标签: c++ memory memory-leaks glibc


【解决方案1】:

几乎可以肯定,大小为 4 的无效写入是导致问题的原因。您正在踩踏不属于您的内存,很可能就在动态分配的内存区域之前或之后。

大小为 4 的无效读取也有问题,但不会导致您获得的输出。无论如何都要修复它们。 :-)

记忆错误可能是一个巨大的痛苦,因为它们的影响可能与问题的真正所在相距甚远。这就是 Valgrind 等工具的用途之一。内存泄漏检测实际上是一个小功能。

【讨论】:

  • 那些错误指向我调用 std::swap 的地方。它在一个填充的向量上被调用,并且索引是有效的。为什么这会导致问题?
  • @XBigTK12X:这很奇怪。我不知道为什么会这样。被交换的值是否有自己的复制构造函数和/或赋值运算符?
  • 对 std::vector 中的两个元素调用交换。
  • @XBigTK13X:像这样的东西:::std::swap(v[x], v[y])?你确定xy 总是小于v.size() 吗?也许其中一个最终会脱离向量的末端。无效读取和写入的大小正好是 4 字节这一事实很有意义,因为这就是 int 的大小。
  • 向量的边界是有效的,我测试了各种情况,总是得到有效的输出。
【解决方案2】:

您是否跟踪了 valgrind 日志中不断出现的 Invalid read of size 4 消息的根本原因?
那些无效的读取是你问题的根本原因。

【讨论】:

  • 当我在向量中的两个元素上调用 std::swap 时会发生这种情况。知道为什么这可能会导致问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多