我意识到这个错误有很多问题
*** glibc detected *** /usr/bin/obj_to_bob_debug: free(): invalid pointer: 0x0000000000bde130 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7ec66)[0x7f2d1f33fc66]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x23)[0x7f2d1fc31c13]
/usr/bin/obj_to_bob_debug[0x4023b7]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f2d1f2e278d]
/usr/bin/obj_to_bob_debug[0x402109]
======= Memory map: ========
00400000-00415000 r-xp 00000000 fc:00 1061803 /usr/bin/obj_to_bob_debug
00614000-00615000 r--p 00014000 fc:00 1061803 /usr/bin/obj_to_bob_debug
00615000-00616000 rw-p 00015000 fc:00 1061803 /usr/bin/obj_to_bob_debug
00bde000-00bff000 rw-p 00000000 00:00 0 [heap]
7f2d1f2c1000-7f2d1f476000 r-xp 00000000 fc:00 275257 /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f476000-7f2d1f676000 ---p 001b5000 fc:00 275257 /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f676000-7f2d1f67a000 r--p 001b5000 fc:00 275257 /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f67a000-7f2d1f67c000 rw-p 001b9000 fc:00 275257 /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f67c000-7f2d1f681000 rw-p 00000000 00:00 0
7f2d1f681000-7f2d1f696000 r-xp 00000000 fc:00 262189 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f696000-7f2d1f895000 ---p 00015000 fc:00 262189 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f895000-7f2d1f896000 r--p 00014000 fc:00 262189 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f896000-7f2d1f897000 rw-p 00015000 fc:00 262189 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f897000-7f2d1f992000 r-xp 00000000 fc:00 275262 /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1f992000-7f2d1fb91000 ---p 000fb000 fc:00 275262 /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb91000-7f2d1fb92000 r--p 000fa000 fc:00 275262 /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb92000-7f2d1fb93000 rw-p 000fb000 fc:00 275262 /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb93000-7f2d1fc75000 r-xp 00000000 fc:00 1054000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fc75000-7f2d1fe74000 ---p 000e2000 fc:00 1054000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe74000-7f2d1fe7c000 r--p 000e1000 fc:00 1054000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe7c000-7f2d1fe7e000 rw-p 000e9000 fc:00 1054000 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe7e000-7f2d1fe93000 rw-p 00000000 00:00 0
7f2d1fe93000-7f2d1feb5000 r-xp 00000000 fc:00 275249 /lib/x86_64-linux-gnu/ld-2.15.so
7f2d200a8000-7f2d200ad000 rw-p 00000000 00:00 0
7f2d200b2000-7f2d200b5000 rw-p 00000000 00:00 0
7f2d200b5000-7f2d200b6000 r--p 00022000 fc:00 275249 /lib/x86_64-linux-gnu/ld-2.15.so
7f2d200b6000-7f2d200b8000 rw-p 00023000 fc:00 275249 /lib/x86_64-linux-gnu/ld-2.15.so
7fffe2f9f000-7fffe2fc0000 rw-p 00000000 00:00 0 [stack]
7fffe2ffe000-7fffe3000000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
在我发布大量代码之前,我会尝试解释一下我觉得奇怪的事情...... 我使用g ++编译我的程序(4 .cpp文件和3 .h文件),95%的时间运行正常。 它解析.obj文件并写出我自己的二进制格式.bob。 在发生此错误的文件上,对于完全相同的调用是一致的,例如。
root@DevVm64-Liam:/# /usr/bin/obj_to_bob_debug /usr/local/apache2/htdocs/uploads/3dmodels/3/24/sample\ obj\ file.obj
但是对于任何失败的文件,更改输入文件名的长度会使其运行正常,例如。
root@DevVm64-Liam:/# /usr/bin/obj_to_bob_debug /usr/local/apache2/htdocs/uploads/3dmodels/3/24/sample\ obj\ file1.obj
但更改文件名,使其长度与错误相同。
无论文件名中的[正确转义]空格如何,都会发生这种情况。
而是发布一堆代码(我不知道我的代码中的错误发生在哪里)任何人都可以建议为什么会发生这种情况? 如果有必要,我可以尝试删除大部分代码并发布可能发生的可能区域。
注意:我从不打电话给免费或删除,因为我只使用一个或两个auto_ptr
我有一种感觉,但我不确定这段代码是否存在问题
string outFile;
//if no output file given set to same as input file with obj replaced with bob
if (argc == 2) {
char* tempOutFile = new char[fineName.length()];
strcpy(tempOutFile, (fileName.substr(0, fileName.length()-4) + ".bob").c_str());
outFile.assign(tempOutFile);
delete tempOutFile;
} else {
outFile = argv[2];
}
我一直在阅读strcpy可能存在问题,但我没有看到代码有任何问题...
答案 0 :(得分:1)
非常确定这是一种未定义的行为。 strcpy
正在复制到未初始化的指针。
char* tempOutFile; // = ???
// now your copying from the sub-string to an unknown memory address
strcpy(tempOutFile, (fileName.substr(0, fileName.length()-4) + ".bob").c_str());
所有这一切只是将子字符串复制到另一个字符串?就这样做:
string outFile;
//if no output file given set to same as input file with obj replaced with bob
if (argc == 2) {
outFile = fileName.substr(0, fileName.length()-4) + ".bob";
} else {
outFile = argv[2];
}
另外,请不要忘记调用该程序的名称用于argv[0]
。因此,如果argc == 2
,您的程序实际上只有一个参数argv[1]
。
$ ./prog arg1 arg2
argv ^-- 0 ^--1 ^--2
argc == 3 (size of argv)