Получение ошибок сегментации в QFile::setFileName

Для функции ведения журнала с использованием ROS rqt+Qt4 я пытаюсь писать в несколько файлов в жестко заданной иерархии папок.

У меня есть родительский класс, наследуемый от QtWidget, содержащий несколько членов QFile*. Затем я назначаю им хранилище с помощью *filehandle = new QFile(this).

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


person thegermanpole    schedule 03.02.2015    source источник


Ответы (2)


Некоторый код поможет.

Из того, что я вижу, результатом нового является *QFile, который должен быть назначен другому *QFile

QFile * filehandle;

*filehandle = new QFile(this)     //is wrong

filehandle = new QFile(this)      //is right

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

Если вы сильно застряли в проблеме ошибки сегментации, быстрый способ узнать, в чем проблема, — запустить вашу программу с помощью отладчика (gdb). Если вы используете QT Creator, процесс очень прост.

person Pablo Gutiérrez    schedule 03.02.2015
comment
QtCreator + RQT не так просто... в конце концов я сдался и изменил его, чтобы хранить дескрипторы в стеке. - person thegermanpole; 04.02.2015

Я получил ту же ошибку, что и объявлял QFile как частную переменную внутри своего класса.

QFile  archivo_pattern_bin;

затем с его помощью открыть шестнадцатеричный файл по указанному абсолютному пути

archivo_pattern_bin.setFileName(pattern_file_path);
archivo_pattern_bin.open(QIODevice::ReadWrite);
archivo_pattern_bin.flush();

это вернуло ошибку сегментации окон при отладке точно в setFileName()

Но теперь я просто объявляю указатель

QFile * archivo_pattern_bin;

и динамическое создание объекта Qfile

archivo_pattern_bin = new QFile(this);
archivo_pattern_bin->setFileName(pattern_file_path);
archivo_pattern_bin->open(QIODevice::ReadWrite);
archivo_pattern_bin->flush();

Кроме того, я записывал массив за пределами его определенного размера, тем самым все искажая.......

и теперь все в порядке :D спасибо пабло

person javi    schedule 06.05.2021