2015-03-04 3 views
-1

gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) запустить мой код будет coredump. Valgrind сообщение:libstdC++ invalid free std :: string

==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.

EDIT:

вчера, я узнал, ошибка моих кодов. например: static array[1024][4]; array[1023][4] = '\0'; // this destroy other object после того, как я изменил этот код, он работает хорошо.

+2

«Это ошибка gcc?» Скорее всего, это будет ошибкой в ​​вашем коде. – Mat

+2

Можете ли вы предоставить минимальный пример исходного кода, который вызывает проблему? –

ответ

3

На балансе вероятностей, нет, это далеко скорее всего, будет ошибка в собственного кода. Есть бесчисленные миллионы разработчиков «тестирования» gcc каждый день, тогда как код, вероятно, был протестирован, ну, просто вы :-)

Наиболее вероятным объяснением является то, что вы вызываете неопределенное поведение, которое просто происходит с «работой» «на одной из платформ, хотя это никоим образом не делает ее хорошей идеей.

Если бы вы предоставили код, мы могли бы быть более окончательным. Без этого, боюсь, общности - это лучшее, что мы можем сделать.


Одна вещь, вы может хотите посмотреть, хотя это не может быть плодотворным. Если этот адрес в последней строке вашего вывода valgrind является освобождаемым адресом, потенциально опасно, что он находится в BSS, который обычно используется для статически определенных переменных, а не для областей памяти, используемых для динамического распределения.

Тем не менее, это очень в зависимости от реализации, следовательно, почему я включаю его как в сторону.

Основной ответ остается вероятностью проблемы (описание) в вашем собственном коде.


И, основываясь на вашем позже комментарий, что у вас есть код:

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

, который действительно ошибка.

Это определение дает массив элементов, которые вы можете на законных основаниях доступ как:

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

Использование индекса массива за пределами этого диапазона считается неопределенным поведением, которое может также коррумпированной некоторые другие фрагмент информации, например как указатель на кучу памяти, которую вы позже попытаетесь освободить.

+0

есть. это ошибка моего собственного кода. 'static char array [1024] [4]; array [1023] [4] = 0; ',' array [1023] [4] 'уничтожить другой объект. –

Смежные вопросы