[질문]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
댓글 달기