0

我编写了一个命令行实用程序,用于从 DXF 文件中提取文本。我的实用程序被命名为drawingtotext。假设这样的目录结构(Linux OS):

/home/dave/dxfs/

在 dxfs 文件夹中有一堆 DXF 文件。从那个位置,假设存在一个名为“P1-1522-YI-WD-0403r1.dxf”的文件,像这样运行drawingtotext会失败:

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

有错误:Segmentation fault (core dumped)

runningdrawingtotext ~/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”

4

1 回答 1

0

对于您的第一个drawingtotext P1-1522-YI-WD-0403r1.dxf命令错误,您确定可执行文件与 P1-1522-YI-WD-0403r1.dxf 位于同一文件夹中吗?

当您释放尚未分配的内存时,会发生第二个错误。通过查看您的代码,此错误必须发生在接近末尾的delete inputordelete output行上,因为这是您释放任何内存的唯一地方。
你说

“运行它给了我我期望的结果以及最后的这个[错误]?”

如果输出是按照您的需要创建的,并且唯一错误的是这个错误,那么您可以通过添加以下内容来解释它:

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

以避免释放未分配的内存。但同样,如果输出正确,就像你说的那样,这只会解决你的问题,这有效,但它可能表示更大的错误。

您应该使用 Strace 运行该程序,以便在 seg 错误和 free() 错误之前查看系统调用。

于 2013-07-17T15:24:53.297 回答