LINUX.ORG.RU

Массив в классе на С++ и глюки в Linux


0

0

Заделитесь опытом на тему:

Образно так: есть класс в котором есть приватный член в виде массива (ну например int[32]) и положим он конструктором не инициализируется, делается это при его первом использовании в публичной функции интерфейса. Класс сам по себе работает ОК и никаких ошибок нет. Но есть в проге еще десяток классов и они используются и сами по себе работают, но вот если начинать использовать все в месте то успешность работы программы начинает ЗАВИСЕТЬ от порядка создания объектов. В лине прога при одном порядке создания объектов работает а при другом получаем сегфолты в произвольных местах программы при доступе к совершенно законным переменным (вернее в отладчике все ОК с указателями а сегфолт есть), причем сбои по трэйсам идут к glibc...
Код не привожу ибо его много ( > 1000 строк ) и не весь можно выкладывать на публику ( 1 не все мое 2 ком тайна ) а смоделировать эту фигню пока неполучилось.

ЗЫ: прога 100 процентов рабочая ибо отлажена и проверена, но на FreeBSD а при переносе на линь получаем сегфолты в отфонарных местах (сегфолт при присваении нуля автоматической переменной это уже через чур...). Есть еще индивиды у которых массивы в данных объекта класса провоцируют ху...ню?

ЗЫЫ если класс этот выкинуть то все работает (он там нужный но независимый, ну да несуть, его другие не используют)

anonymous

> ЗЫ: прога 100 процентов рабочая

Угу, конечно. valgrind в зубы и вперёд. Много интересного узнаете.

anonymous
()

>>сегфолт при присваении нуля автоматической переменной это уже через чур...

где-то бьётся память 100%. Ищи в valgrind'e

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

я тут прежде чем писать уже много чего нового с valgridом узнал, а хуйня при вызовах осталась, делаешь объект статическим все ОК, делаешь указателем и пользуешь new сегфолт, меняешь местами порядот создания объектов все ОК, меняешь назад сегфолт. Вы если такой гений то поясните мне плиз следующее:

объект С использует объекта А и В. Объекты А и В друг от друга полностью независят => порядок их инициализации(создания) не имеет значения лишь бы они были создано до С. Теперь вопрос: Какого х..я в лине надо создавать сначало А (с массивом) а потом В и С???? (Если создашь сначала В а потом А и С то будешь ловить сегфолты и аварийные завершения в glibcе).

ЗЫ: я полагаю что если написанный на СТАНДАРТНОМ С++ КОД РАБОТАЕТ В FREEBSD ТО ОН ДОЛЖЕН РАБОТАТЬ И В LINUX естестно будучи скомпилиным в лине.

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

Держите себя в руках.

Ваш код содержит ошибку. Если вы её не видите, это не значит, что её нет. Если ваш код работает под FreeBSD, это не значит, что он корректный, это значит, что ошибка под FreeBSD не проявляется. Странно, что мне приходится это объяснять.

Вы говорите, что программа падает. Если вы скомпилируете её с отладочной информацией и запустите под valgrind-ом, вам будет показана причина падения, стектрейс и т.д. Думаю, разумнее всего будет, если вы объясните, почему эта информация вам не помогает.

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

> разрывы были?

баян и жопу уже порвали. Searching.. Seek and Destroy.

dilmah ★★★★★
()

Судя по тому, что ты написал, ошибка проявляется при использовании libc из Linux (glibc). Убедись, что используешь стабильную версию glibc. Поищи в её багзилле что-нибудь подобное. Возможно, кто-то до тебя с этим уже сталкивался. Ну и, само собой, отлаживай программу. libc в разных системах разные, поэтому и ошибка не во всех реализациях проявляется. Но ошибка точно есть.

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

сообщения типа "glibc чего-то там corrupted" появляются как раз из-за битой памяти _у тебя_ в программе. Без кода тут сказать сложно (ком. тайна, ага), и всё что смогли уже посоветовали (valgrind).

alex_custov ★★★★★
()

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

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12

> и не весь можно выкладывать на публику ( 1 не все мое 2 ком тайна )

Тогда и ответы -- только за деньги.

Dselect ★★★
()

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

Например, есть ли у Вас в коде глобальные переменные, объявленные в одних файлах, обращение к которым происходит из других файлов (через объявление extern)? Являются ли эти переменные экземплярами классов с нетривиальными конструкторами? Если да, то возможны проблемы. Один из способов решения таких проблем - замена обращений по extern-ссылкам на вызов функций типа GetInstance с соответствующей реализацией (например, так: A& GetA(){static A a; return a;} - подойдет в случае однопоточного приложения вместо обращений к extern A theA;)

gzh
()

я тут тоже когда-то кричал что glibc глюкалово, а потом решил-таки валгринд запустить :). и, о чудо, нашёл ошибку :). Ищите, короче, дальше...

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