2016-05-03 7 views
-1

Беги без проблем в первый раз, но когда я комментирую часть кода, завершение программы:Двоичный файл ошибка чтения

enter image description here

enter image description here

+2

Пожалуйста, не размещайте изображения * текста *, особенно ссылки на изображения. Если ссылки затянутся, ваш вопрос станет бесполезным. Вместо этого скопируйте текст в текст вопроса. Пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask), и узнайте, как создать [Минимальный, Полный и Подтверждаемый пример] (http: // stackoverflow. ком/помощь/mcve). –

+0

можете ли вы поделиться своим кодом здесь? – Mostafiz

ответ

1

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

Позволяет принять этот std::string член name. Объекты std::string в основном представляют собой только указатель динамически выделенному массиву символов (т. Е. Строку с нулевым символом в стиле С), а также длину содержащейся строки. Проблема двояка: во-первых, при попытке сохранить объект name он не сохраняет строку, а указатель; И вторая проблема заключается в том, что указатели на динамически распределенные данные являются уникальными для каждого процесса.

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

Что вам нужно сделать, это serialize строка. Если вы хотите написать код самостоятельно, а не использовать библиотеку для него (есть много великолепных библиотек сериализации, которые вы можете использовать), тогда вам нужно записать длину строки как целое число фиксированного размера, а затем записать фактические строковые данные. Когда вы deserialize, вы сначала должны знать, что следующая часть данных для чтения является строкой, а затем читать длину, затем строковые данные, а затем строить из этого строковый объект.

+0

Я добавил , но это все еще неправильно. Что мне делать, чтобы изменить код? –

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