【问题标题】:libstdc++ invalid free a std::stringlibstdc++ 无效释放 std::string
【发布时间】:2015-05-05 04:12:23
【问题描述】:

gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 运行我的代码将核心转储。 valgrind 消息是:

==14892== Invalid free() / delete / delete[] / realloc()

==14892==    at 0x4C2B343: operator delete(void*) (vg_replace_malloc.c:502)

==14892==    by 0x53404DE: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)

==14892==    by 0x5AE2258: __run_exit_handlers (exit.c:82)

==14892==    by 0x5AE22A4: exit (exit.c:104)

==14892==    by 0x5AC7ECB: (below main) (libc-start.c:321)

==14892==  Address 0x55892e8 is in the BSS segment of /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19

当我使用 gcc 版本 4.7.2 20121015 (Red Hat 4.7.2-5) (GCC) 时,它不会进行核心转储。

编辑:

昨天,我发现了我的代码的错误。如: static array[1024][4]; array[1023][4] = '\0'; // this destroy other object 在我更改此代码后,它运行良好。

【问题讨论】:

  • "这是 gcc 的错误吗?"它更有可能是代码中的错误。
  • 您能否提供导致问题的源代码的最小示例?

标签: c++11 gcc libstdc++


【解决方案1】:

在概率的平衡上,不,它更有可能是您自己的代码中的错误。每天都有数以百万计的开发人员“测试”gcc,而您的代码可能已经被测试过,好吧,只有您 :-)

最可能的解释是,您正在调用恰好在其中一个平台上“工作”的未定义行为,尽管这绝不是一个好主意。

如果您要提供代码,我们可能会更加明确。如果没有这个,恐怕我们能做到的就是笼统的。


可能想看看的一件事,尽管它可能不会有成果。如果valgrind 输出最后一行的地址是被释放的地址,则可能担心它在 BSS 中,它通常用于静态定义的变量,而不是用于动态分配的内存区域。

不过,这非常依赖于实现,因此我将其作为旁白。

核心答案仍然是您自己的代码中出现问题的可能性(一些描述)。


并且,根据您后来的评论,您的代码如下:

static char array[1024][4];
array[1023][4] = 0;

确实是一个错误。

该定义为您提供了一个可以有效访问的元素数组:

array[0..1023][0..3]

使用超出该范围的数组索引被视为未定义行为,这很可能会破坏其他一些信息,例如指向您稍后将尝试释放的堆内存的指针。

【讨论】:

  • 是的。这是我自己的代码的错误。 static char array[1024][4]; array[1023][4] = 0; , array[1023][4] 销毁其他对象。
猜你喜欢
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多