LINUX.ORG.RU

Непонятки с оператором new


0

0

Загадка несколько телепатическая, тому кто отгадает огромный респект

Есть некоторая программа соеджащая примерно такой код 

while(...) {
   ... 
   Pobject p = new MyObject(...); 
   ...
}

При компиляции штатным компилятором gcc 3.x в системах RedHat 9, ASP 
Linux 9, Slackware 10, FreeBSD 5.3  и последующим запуском на 
выполнение все работает "на ура".

При компиляции (штатным gcc 4.0.0-8) и последуюшем выполнении в 
FedoraCore 4. Программа выпадает на операторе new на i-й итерации указанного кода. Вот что пишется в 
корку 


  #0  0x009c2402 in __kernel_vsyscall ()
#1  0x00b611f8 in raise () from /lib/libc.so.6
#2  0x00b62948 in abort () from /lib/libc.so.6
#3  0x00b9652a in __libc_message () from /lib/libc.so.6
#4  0x00b9d3ea in _int_malloc () from /lib/libc.so.6
#5  0x00b9e792 in malloc () from /lib/libc.so.6
#6  0x00251bf6 in operator new () from /usr/lib/libstdc++.so.6
#7  0x080cda4f in Opencxx::GFunc::UpdateArgsByDefine (this=0x101e9ee8, 
    _fa_list=@0xbfa60f4c) at gxfunc.cc:361

в терминал выдается длинная колбаса начинающаяся так

*** glibc detected *** ./lnew_parser: malloc(): memory corruption: 0x10287b60 ***

Перегруженные new в моей программе отсутсвуют. Как программа может падать на стандартном new, объясните пожалуйста ?
anonymous

Мой вариант - писать минимальный код (лучше путем выкидывения из старого), который еще приводит к ошибке и смотреть уже на него.

Заодно в случае чего будет что послать разработчикам :)

alexru ★★★★
()
Ответ на: комментарий от alexru

Я потому и не привел более подробный код, что он на столько специфичен, что никто его не поймет, а вырезать что-либо из него бесполезно и очень долго.

anonymous
()
Ответ на: комментарий от anonymous

ну так нужно будет отладить - придется вырезать. никакого криминала в том что ты пивел нет => или ошибка не тут или она в gcc (а учитывая что в старых gcc все работает, то скорее всего в нем)

alexru ★★★★
()

может valgrind здесь сможет помочь?

no1sm ★★
()

Если непоказанный код и правда такой специфичный, то неплохо бы сваять минимальный случай - "доказательство" бага, и обсудить его в рассылке gcc. Вполне возможно, что до тебя таких программ никто не писал и ещё долго не напишет, так что кроме тебя изменить этот мир некому.

erDiZz
()
Ответ на: комментарий от MKuznetsov

Не вникай, это просто метод определенного класса в котором находится указанный код.

GameMagister
()

такие ошибки неаккуратные люди вагонами допускают. 99%, что там в цикле кто-то портит память.

Показывай весь код.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Согласен. Такие ошибки чаще всего связаны с выходом за границы выделенного участка. То есть:

int* a = new int[2]; a[2] = 0; // вот она - ужасть! int b = new int[2]; // вот тут могут бать неприятности delete[] a; // или тут

Жди ошибок в общем случае неизвестно где. Похоже, что у тебя та же самая проблема.

devinull ★★
()
Ответ на: комментарий от kosmonavt

а ниточками не балуетесь случайно? глупо конечно, но для собственного спокойствия, delete делаем?

anonymous
()
Ответ на: комментарий от GameMagister

А new падает только в постный день?
Если есть разрушение структур управления памятью,
то что delete/free, что new - одна песня.

io ★★
()

> Загадка несколько телепатическая

Ну что ж ;)

Попробуй обратить внимание на переменную среды MALLOC_CHECK.

Есть некоторый шанс, что на FC 4 она почему-то равна двум.

В любом случае, интересно установить ее в двойку на системах, не имеющих проблем с выполнением твоей программы, и посмотреть, не появтяся ли они.

Нет ничего особенно странного в том, что некоторый баг может проявляться или нет в зависимости от стратегии memory management, которая может отличаться у разных библиотек. Успехов в поисках!

anonymous
()

Ты совершенно очевидно где-то в другом месте в память гадишь. Ищи утечки и переполнения.

Debiloid
()

Как и предполагалось, ошибка была связана с засиранием не того участка памяти. Всем спасибо за сочувствие.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.