Russian Qt Forum

Qt => Общие вопросы => Тема начата: 0...-5 от Январь 11, 2013, 10:20



Название: Получить собственные данные из QSettings
Отправлено: 0...-5 от Январь 11, 2013, 10:20
Здравствуйте, у меня возникла такая проблема:
Я разработал некоторый класс для хранения данных, зарегистрировал его в мета-объектной системе макросом q_declare_metatype(), определил потоковые операторы <</>> и зарегистрировал их с помощью  qRegisterMetaTypeStreamOperators().

После этого я попытался получить свой класс из объекта QSettings и заметил следующую вещь:
вызов
Код:
MyClass c = qvariant_cast<MyClass>(settings.value("key"))
приводит к ошибке segmentation fault при вызове функции
Код:
void QMetaType::destroy(int type, void *data)
Если же выполнить нечто вроде
Код:
QVariant value = settings.value("key");
MyClass c = qvariant_cast<MyClass>(value);
то ошибка не возникает.

В чем здесь дело?


Название: Re: Получить собственные данные из QSettings
Отправлено: gil9red от Январь 11, 2013, 23:01
Могу ошибаться, но разве QVariant не хранит просто указатель?

ведь вы в QVariant поместили ссылку/указатель(1), и ее извлекли - нормально, ведь данные на которые (1) указывала существуют...

а QSettings производит чтение/запись в файл (реестр/ini-файл), и в него таким макаром просто запишете (1), а (1) просто набор байтов
и когда будете с помощью QSettings вытаскивать (1) из файла может оказаться что (1) указывает хрен-знает-куда и программа падает

ведь сами написали, какая вылезла ошибка, а именно ошибка сегментации, вики говорит, что это:
"Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом."


Название: Re: Получить собственные данные из QSettings
Отправлено: gil9red от Январь 11, 2013, 23:07
Если ваш класс не имеет неограниченное количество значений, которые нужно записывать, то стоит в QSettings записывать именно это значения :)
если что, QSettings может и массивы записывать/считывать ;)


Название: Re: Получить собственные данные из QSettings
Отправлено: Igors от Январь 12, 2013, 01:38
то ошибка не возникает.

В чем здесь дело?
Наверное тоже возникает, только позже, когда value выйдет за пределы видимости. Нужно проверить конструктор копирования для MyClass