2011-03-08 29 views
0

我在ofstream文件close()上得到一个SIGABORT。顺便说一句,这是自上一个工作版本以来我没有改变过的功能的一部分。以下是Valgrind输出。我没有想到问题出在哪里。任何人都可以帮我弄清楚这一点。C++:SIGABRT on ofStream.Close()

==11082== Invalid write of size 4 
==11082== at 0x40EA72A: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string() (basic_string.h:255) 
==11082== by 0x8050408: SFile::SFile() (SFile.cc:11) 
==11082== by 0x8056A5E: DFile::Create(char*, fType, void*) (DFile.cc:55) 
==11082== by 0x8059D02: test1() (test.cc:48) 
==11082== by 0x805A628: main (test.cc:163) 
==11082== Address 0x4331f64 is 0 bytes after a block of size 52 alloc'd 
==11082== at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255) 
==11082== by 0x8056A52: DFile::Create(char*, fType, void*) (DFile.cc:55) 
==11082== by 0x8059D02: test1() (test.cc:48) 
==11082== by 0x805A628: main (test.cc:163) 
==11082== 
==11082== Syscall param write(buf) points to uninitialised byte(s) 
==11082== at 0x404A523: __write_nocancel (syscall-template.S:82) 
==11082== by 0x40B5515: std::basic_filebuf<char, std::char_traits<char> >::_M_convert_to_external(char*, int) (fstream.tcc:471) 
==11082== by 0x40B5661: std::basic_filebuf<char, std::char_traits<char> >::overflow(int) (fstream.tcc:426) 
==11082== by 0x40B5E57: std::basic_filebuf<char, std::char_traits<char> >::_M_terminate_output() (fstream.tcc:783) 
==11082== by 0x40B6227: std::basic_filebuf<char, std::char_traits<char> >::close() (fstream.tcc:154) 
==11082== by 0x40B8104: std::basic_ofstream<char, std::char_traits<char> >::close() (fstream:738) 
==11082== by 0x80508A2: SFile::Create(char*, fType, void*) (SFile.cc:45) 
==11082== by 0x8056AB5: DFile::Create(char*, fType, void*) (DFile.cc:61) 
==11082== by 0x8059D02: test1() (test.cc:48) 
==11082== by 0x805A628: main (test.cc:163) 
==11082== Address 0x4332278 is 16 bytes inside a block of size 8,192 alloc'd 
==11082== at 0x4025FE5: operator new[](unsigned int) (vg_replace_malloc.c:299) 
==11082== by 0x40B4BB2: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (fstream.tcc:54) 
==11082== by 0x40B63C1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (fstream.tcc:102) 
==11082== by 0x40B7566: std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(char const*, std::_Ios_Openmode) (fstream:699) 
==11082== by 0x805080F: SFile::Create(char*, fType, void*) (SFile.cc:39) 
==11082== by 0x8056AB5: DFile::Create(char*, fType, void*) (DFile.cc:61) 
==11082== by 0x8059D02: test1() (test.cc:48) 
==11082== by 0x805A628: main (test.cc:163) 
==11082== 

代码:

int SFile::Create (char *fPath, fType fileType, void *start) 
{  
    _file.Open(0, fPath); 
    _file.Close(); 

    int ftype = sorted;  
    sInfo *sInfo=(sInfo*)start; 
    ofstream metaF(fPath,ios::out|ios::binary|ios::ate);  
    metaF.write((char*)sInfo->oMaker,sizeof(oMaker)); 
    metaF.write((char*)&(sInfo->rLength),sizeof(int)); 
    metaF.close(); //here it throws SIGABORT when debugging 
    return 1; 
} 

编辑:奇怪的是,当我加入了SIGARBT错误去了: #include<string>

为什么这个没有给编译错误!?

+1

发布一些代码,请(: – 2011-03-08 08:49:33

+0

更新问题 – Meebo 2011-03-08 08:56:58

+0

尽量减少所需的代码来重现问题,或给我们所有的相关信息,你的代码包含一个神秘的'_file'对象,可能是错误的真正原因,但你没有提供任何关于它的信息 – 2011-03-08 09:17:02

回答

0

ofstream的可能无法打开一个文件,你应该检查一下你流的任何操作之前是有效的:

ofstream metaF(fPath,ios::out|ios::binary|ios::ate); 
    if (metaF.good()) 
    { 
    metaF.write((char*)sInfo->oMaker,sizeof(oMaker)); 
    metaF.write((char*)&(sInfo->rLength),sizeof(int)); 
    metaF.close(); 
    } 
return 1;