0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 19
|
|||||||||||
Ошибка при чтении символов строки при создании объекта класса26.03.2021, 17:42. Показов 3540. Ответов 9
У меня имеется класс Song, в котором присутствуют поля имени песни (Name) и длительности песни (Duration). Также в этом классе есть конструктор, заполняющий поля стандартными значениями. При создании такого объекта в main() смотрю через отладчик, что в поле Name (а именно - Name -> _MyPair -> Базовое представление -> _MyVal2 -> _Bx -> _Ptr) есть надпись - "ошибка при чтении символов строки". Причем странно, что все время все компилилось и работало, но сегодня почему-то вылезло такое. Короче, сам код:
0
|
26.03.2021, 17:42 | |
Ответы с готовыми решениями:
9
Ошибка при чтении объекта класса из файла
|
Вездепух
![]() ![]() ![]() 12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,065
|
|
27.03.2021, 06:09 | |
Не понял. Где проблема? Зачем вы туда полезли смотреть? У вас что-то не работало? Если что-то не работало - то пишите, что именно.
Также: где в вашем вопросе написано, какую реализацию std::string вы использовали? Компилятор? Отладчик?Внутреннее представление класса std::string зависит от реализации и может быть оптимизировано массой разных способов, особенно для коротких или пустых строк. Вполне возможно, что для такой - пустой - строки через этот указатель и не должно быть видно никаких осмысленных символов. Да, и я тоже вижу, что у меня в Visual Studio в таком примере поле ... _Bx -> _Ptr содержит мусор. Это нормально.Возьмите строку подлиннее, и вы увидите, что, начиная с какой-то длины (16 символов?), начнет использоваться поле ... _Bx -> _Ptr .Еще раз: где описание реальной проблемы, которую вы пытаетесь решить? Что не работает? Не нужно строить фантастических теорий, когда вполне естественное и логичное объяснение лежит на поверхности.
0
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 19
|
||||||
27.03.2021, 06:29 [ТС] | ||||||
Да, я потом использую эту переменную Name для проверки имени на соответствие. Пользователь вводит название песни, прога проверяет все альбомы на подходящие песни и возвращает первую найденную. В альбомах по 4 песни. Как работает цикл: пока имя песни не пустое значение, то проверяй ее на соответствие, иначе переходи к следующему альбому. В первом альбоме 4 песни он проверяет нормально, но как только доходит до следующей песни (которой по факту не существует, там должен мусор лежать), там лежит "ошибка чтения символов строки", и выдает исключение bad_alloc.
Если бы просто мусор - то да, нормально. Но туда почему-то записывается именно ошибка. Код скину в след. посте, чтоб этот не нагромождать. Добавлено через 6 минут У меня еще есть класс Band (это сама группа, но она не так важна, там лишь метод сравнения песен лежит, который нужен).
0
|
Вездепух
![]() ![]() ![]() 12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,065
|
|
27.03.2021, 06:39 | |
Вы делаете какие-то дикие и странные фантасмагорические выводы. С чего вы взяли, что туда "записывается именно ошибка"? Никакая "ошибка" туда не записывается.
Поле ... _Bx -> _Ptr в отладочном режиме содержит 0x6161616161616161 или 0xcdcdcdcdcdcdcd00 , т.е. какое-то явно специально выбранное бессмысленно-мусорное указательное значение. А сообщение об "ошибке" вам пишет уже отладчик. Никуда это сообщение не "записывается".Никакого отношения к теме ... _Bx -> _Ptr эта ошибка не имеет. Вы накосячили где-то совсем в другом месте.
0
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 19
|
|
27.03.2021, 06:40 [ТС] | |
Однако прога перестала работать ни с того ни с сего. Пошел в отладчик и нашел такое. Раньше этого не было. Ничего я у класса песни не менял. Так ведь заметь, что в других классах с именами все в порядке, с песнями почему-то такое приключилось
0
|
Вездепух
![]() ![]() ![]() 12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,065
|
|
27.03.2021, 06:50 | |
![]() Решение
Нет, вы выдумываете. Это было всегда. Это совершенно нормальное поведение
std::string .Еще раз: никакого отношения к теме ... _Bx -> _Ptr ваше "перестала работать" не имеет. Вы накосячили где-то совсем в другом месте.Перестаньте заниматься фигней и разглядывать ... _Bx -> _Ptr , а ищите у себя косяки: вылет за пределы массива, обращение к удаленной памяти и т.п.Добавлено через 6 минут Чего? Это что за белиберда? Какое еще "должен мусор лежать"? Ваш цикл поиска песни написан так, что последовательность песен в альбоме обязательно (!) должна заканчиваться песней с пустым именем. Не "мусором", а песней с пустым именем (!). Если в альбоме 4 песни, то размер массива песен должен равняться 5 и последняя "фиктивная" песня должна иметь пустое имя. Если вы не соблюдете это жесткое правило, программа будет падать.
1
|
0 / 0 / 0
Регистрация: 23.08.2020
Сообщений: 19
|
|
27.03.2021, 07:13 [ТС] | |
Смотри, я в конструкторе изменил поле присвоения названия песни на 20-25 букв d, вместо "" (как ты и сказал, взять строку подлиннее). И заработало. Возвращаю обратно на пустое имя - ошибка. Как так-то? Неужели мне теперь по стандарту каждой песни какое-то имя из 15+ букв задавать? Некрасиво как-то.
Цикл безотказно работает. При встрече с мусором он его считает за пустую строку и просто переходит к след. альбому. Зачем выделять место еще для одной лишней песни? Вот если б разговор про выделение памяти под символы, то да, выделять нужно на 1 больше заявленного размера для '\0'. UPD. Хм, точно, выделил на 1 больше размер массива - все теперь работает и с пустым значением строки. Спасибо большое!
0
|
фрилансер
![]() 6337 / 5476 / 1108
Регистрация: 11.10.2019
Сообщений: 14,585
|
||||||
27.03.2021, 07:29 | ||||||
Skel, Вот ещё вариант с STL, смотри, насколько всё проще )) Не нужно три дня штурмовать форум, десять минут - и всё готово
1
|
Вездепух
![]() ![]() ![]() 12875 / 6739 / 1810
Регистрация: 18.10.2014
Сообщений: 17,065
|
|
27.03.2021, 07:33 | |
Ым... Што????
![]() При встрече с "мусором" происходит неопределенное поведение и ваша программа падает во все воронье горло. А то, что вам раньше казалось, что она не падала - это вы ее просто плохо тестировали. Чтобы программа не падала. Вам нужно иметь возможность определить фактический размер массива, чтобы не вылетать за его пределы. А как вы это будете делать - ваше дело. Разумнее/экономнее было бы хранить размер массива, как это делает std::vector , а не цеплять в конце массива дополнительную фиктивную песню с пустым именем. Но и так тоже можно. А еще разумнее было бы просто использовать std::vector .Главное - если вы будете рассчитывать на ваше наивное "при встрече с мусором он его считает за пустую строку", то ваша программа будет просто падать.
1
|
27.03.2021, 07:33 | ||||||
Помогаю со студенческими работами здесь
10
Ошибка в работе класса при создании нового объекта
Ошибка при чтении символов строки Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
|
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
|
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
|
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
|
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
|
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
|
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
|
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
|
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
|
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
|