libstdc ++无效的std :: string

时间:2015-03-04 08:43:14

标签: c++11 gcc libstdc++

gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1)运行我的代码将coredump。 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)时,它不会进行coredump。

编辑:

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

1 个答案:

答案 0 :(得分:3)

在概率平衡上,不,它更可能是自己的代码中的错误。有无数的开发人员每天“测试”gcc,而你的代码可能已经过测试,只有你: - )

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

如果您要提供代码,我们可能会更加明确。没有它,我担心,普遍性是我们能做的最好的事情。


你可能希望看到的一件事,虽然它可能不会有成效。如果valgrind输出的最后一行上的地址是被释放的地址,则可能担心它在BSS中,通常用于静态定义的变量,而不是用于动态分配的内存区域。 / p>

但是,非常依赖于实现,因此我将其作为一个包含在内。

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


根据您之后的评论,您的代码如下:

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

确实是一个错误。

该定义为您提供了一系列可以有效访问的元素:

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

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