Я написал утилиту командной строки для извлечения текста из файлов 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»
Для вашей первой ошибки с 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 ().
Других решений пока нет …