[질문]close()에서 세그멘테이션 오류가 나는 이유는 무엇인가요
글쓴이: dufmadlek / 작성시간: 월, 2005/07/04 - 6:14오후
void CMainWindowImpl::GenerateMD5()
{
// Create a file to save md5
m_pMD5File = new CFileBase;
m_pMD5File->Open( m_pleGenerateFileName->text(), "w+" );
for( uint i = 0; i < m_plbTargetDir->count(); i ++ )
{
GetFileName( m_plbTargetDir->text(i) );
}
delete m_pMD5File;
m_pMD5File = NULL;
}
QString CMainWindowImpl::GetFileName( QString strPath )
{
QDir Dir( strPath );
Dir.setSorting( QDir::DirsFirst );
QString strFileName = "";
const QFileInfoList* files = Dir.entryInfoList();
if( files )
{
QFileInfoListIterator it( *files );
QFileInfo* fi;
while( (fi=it.current() ) != 0 )
{
++it;
if( fi->fileName() == "." || fi->fileName() == ".." )
; // nothing
else if( fi->isDir() )
{
strFileName = GetFileName( Dir.path() + "/" + fi->fileName() );
}
else
{
char md5str[128] = {0x00,};
strFileName = Dir.path() + "/" + fi->fileName();
if( _GetMD5( strFileName, md5str ) > 0 )
{
strFileName += "=";
strFileName += md5str;
strFileName += "\n";
m_pMD5File->Write( strFileName, strFileName.length() );
}
} // if-else
} // while
} // if
return strFileName;
}
int _GetMD5( const char* filename, char* md5str )
{
MD5_CTX lctx;
int fd = 0;
char* data = NULL;
struct stat status;
unsigned char digest[16]={0,};
fd = open( filename, O_RDONLY );
if( fd < 0 )
{
return fd;
}
fstat( fd, &status );
data = new char[ status.st_size];
read( fd, data, status.st_size );
MD5_Init( &lctx );
MD5_Update( &lctx, data, status.st_size );
MD5_Final( digest, &lctx );
for( uint i = 0; i < sizeof(digest); ++i )
{
sprintf(md5str+(i*2), "%02x", digest[i] );
}
delete data;
data = NULL;
close( fd ); //<---세그멘테이션 오류(_GetMD5함수를 CMainWindowImpl의 멤버함수로 했을경우)
return fd;
}
_GetMD5라는 함수를 CMainWindowImpl 멤버함수로 했더니
_GetMD5() 마지막 부분 close함수에서 세그멘테이션 오류가 납니다.
그래서 전역함수로 만들었더니 오류가 나지 않고 잘 동작은 하는데 이유가 무엇인지 궁금합니다. ㅠ.ㅠ
Forums:


우선 delete data; 는 delete[] data; 로 변경하셔
우선 delete data; 는 delete[] data; 로 변경하셔야 합니다.
아시겠지만 close()에서 segfault가 나온다고 그곳에 잘못이 있는 것이 아닐 수도 있습니다.
----------------------------------------
http://moim.at
http://mkhq.co.kr
댓글 달기