linux — расположение файла ввода утилиты командной строки C ++ изменяет поведение

Я написал утилиту командной строки для извлечения текста из файлов DXF. Моя утилита называется drawtotext. Предполагая структуру каталогов, подобную этой (ОС Linux):

/home/dave/dxfs/

с кучей файлов DXF в папке dxfs. Исходя из этого положения, если предположить, что существует файл с именем «P1-1522-YI-WD-0403r1.dxf», выполнить команду drawtotext следующим образом:

drawingtotext P1-1522-YI-WD-0403r1.dxf

с ошибкой: Segmentation fault (core dumped)

Бег drawingtotext ~/dxfs/P1-1522-YI-WD-0403r1.dxf дает мне то, что я ожидаю, плюс это в конце:

*** Error in 'drawingtotext': free(): invalid next size (fast): 0x0000000002031170 ***

с обратной трассировкой и огромной картой памяти.

Теперь, перемещение этого файла в каталог (/ home / dave / вместо / home / dave / dxfs /) приводит к точным результатам, которые я ищу, без ошибок. Переименование файла во что-то еще, например, «mydxf.dxf» и сохранение его в / home / dave / dxfs /, также решает проблему.

У меня вопрос: как и почему расположение файла меняет поведение моей программы и как мне это исправить?

Код здесь: http://www.github.com/davidworkman9/drawingtotext/

основной файл называется «AutoCADConverter.cpp»

0

Решение

Для вашей первой ошибки с drawingtotext P1-1522-YI-WD-0403r1.dxf Команда, вы уверены, что исполняемый файл находился в той же папке, что и P1-1522-YI-WD-0403r1.dxf?

Вторая ошибка возникает при освобождении памяти, которая не была выделена. При просмотре вашего кода эта ошибка должна возникать на delete input или же delete output линии в конце, видя, что это единственное место, где вы освобождаете память.
Вы сказали

«Запуск этого дает мне то, что я ожидаю, плюс это [ошибка] в конце?»

Если выходные данные созданы так, как вы хотите, и единственной ошибкой является эта ошибка, то вы можете объяснить это, добавив:

if (input != null) delete input;
if (output != null) delete output;

чтобы избежать освобождения памяти, которая не выделяется. Но, опять же, это решает вашу проблему только в том случае, если выходные данные верны, как вы сказали, это работает, но это может указывать на большую ошибку.

Вам следует запустить программу с Strace, чтобы вы могли видеть системные вызовы до появления ошибки seg и free ().

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]