我编写了一个命令行实用程序,用于从DXF文件中提取文本。我的实用程序名为drawingtotext。假设这样的目录结构(Linux OS):
/home/dave/dxfs/
在dxfs文件夹中有一堆DXF文件。从该位置开始,假设存在名为“P1-1522-YI-WD-0403r1.dxf”的文件,运行此类图形文件将失败:
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 :(得分: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()错误之前看到系统调用。