下面给出导致出现分段错误的部分代码。关闭二进制文件时出现分段错误
ifstream xiFileId(xifile, ios::binary); //xifile is a char *
//the ii_t class in the following line is taken from http://stackoverflow.com/questions/1855704/c-binary-file-i-o-to-from-containers-other-than-char-using-stl-algorithms written by http://stackoverflow.com/users/14065/loki-astari
ii_t<uint> xi_in(xiFileId);
copy(xi_in, ii_t<uint>(), xi.data()); //xi is a 2D boost::multi_array
//my efforts to debug
ios::iostate s = xiFileId.rdstate();
if(s & ios::badbit) cout << "bad bit is set" << endl;
if (s & ios::failbit) cout << "fail bit is set" << endl;
if (s & ios::eofbit) cout << "eof bit is set" << endl;
if (s & ios::goodbit) cout << "good bit is set" << endl;
xiFileId.close(); //this line creates the seg violation
据发现failbit
和eof
位设置。使用valgrind
发现我的整个程序没有内存泄漏。
对另一个二进制文件重复相同的代码(如上所述),并且在关闭该文件时该分段错误不会出现(该文件较早关闭),即使该文件也设置了失败和eof位。
通过使用gdb和下面给出的核心文件来确定文件关闭引起的分段错误。
#0 0x00007f16ad99ae50 in __libc_free (mem=0x1b8f930) at malloc.c:3724
3724 malloc.c: No such file or directory.
in malloc.c
(gdb) bt
#0 0x00007f16ad99ae50 in __libc_free (mem=0x1b8f930) at malloc.c:3724
#1 0x00007f16ae1adf0e in std::basic_filebuf<char, std::char_traits<char> >::_M_destroy_internal_buffer()() from /usr/lib/libstdc++.so.6
#2 0x00007f16ae1af4d4 in std::basic_filebuf<char, std::char_traits<char> >::close()() from /usr/lib/libstdc++.so.6
#3 0x00007f16ae1b133d in std::basic_ifstream<char, std::char_traits<char> >::close()() from /usr/lib/libstdc++.so.6
#4 0x000000000040c119 in main (argc=19, argv=0x7fff05849898) at prediction.cpp:161
如果我删除xiFileId.close();
因为编译器将关闭该文件时,它变成超出范围,gdb的背部走线提供了以下:
#0 0x00007f97fab81e50 in __libc_free (mem=0x15a7930) at malloc.c:3724
3724 malloc.c: No such file or directory.
in malloc.c
(gdb) bt
#0 0x00007f97fab81e50 in __libc_free (mem=0x15a7930) at malloc.c:3724
#1 0x00007f97fb394f0e in std::basic_filebuf<char, std::char_traits<char> >::_M_destroy_internal_buffer()() from /usr/lib/libstdc++.so.6
#2 0x00007f97fb3964d4 in std::basic_filebuf<char, std::char_traits<char> >::close()() from /usr/lib/libstdc++.so.6
#3 0x00007f97fb39c966 in std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()() from /usr/lib/libstdc++.so.6
#4 0x000000000040c184 in main (argc=19, argv=0x7fff59b71918) at prediction.cpp:163
这表明~basic_ifstream()
被称为和分割违规发生。
在什么情况下文件关闭可以创建seg违例?
关于如何进一步调查/修复它的任何想法?
此代码在Ubuntu 10.04上运行,并使用gcc版本4.4.3进行编译。
苏雷什
尝试'拷贝(xi_in,ii_t(),xi.data());'。还要确保收件人已经足够大了。 –
您能否提供一个可以演示问题的最小可编译示例。 –
@KerrekSB是的,它只是ii_t - 它是错字。谢谢 – suresh