我想知道人们如何处理函数中的return语句。我有一个方法,分配一些内存,但返回false;函数出错时的语句。这个语句位于函数的大约一半,所以如果该函数失败,我的内存就会泄露。这不是唯一的回报......;声明我在这个函数中。 stackoverflow建议做什么来清理函数中的代码,其中包含一些return语句?
if( true == OpenFtpConnection() )
{
AfxMessageBox( _T( "Connection to internet and ftp server found" ) );
// set the directory to where the xml file lives
if( false == FtpSetCurrentDirectory( m_ftpHandle, _T(_FTP_XML_LOCATION) ) )
return false;
HINTERNET xmlHandle = NULL;
WIN32_FIND_DATA fileData;
SYSTEMTIME fileWriteTime;
xmlHandle = FtpFindFirstFile( m_ftpHandle, _T("TPCFeed.xml"), &fileData, INTERNET_FLAG_RELOAD, 0 );
if( NULL == xmlHandle )
return false;
else
{
// get the write time of the ftp file
FileTimeToSystemTime( &fileData.ftLastWriteTime, &fileWriteTime );
// get the write time of the local file
HANDLE localFileHandle = NULL;
localFileHandle = CreateFile( _T(_XML_FILENAME_PATH), FILE_READ_ATTRIBUTES,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
NULL, NULL );
if( INVALID_HANDLE_VALUE == localFileHandle )
{
AfxMessageBox( _T( "opening file failed, file not found" ) );
return false;
}
else
{
CloseHandle( localFileHandle );
}
// close the FtpFindFirstFile() handle
InternetCloseHandle( xmlHandle );
}
// download xml file to disk
//if( false == FtpGetFile( m_ftpHandle, _T("TPCFeed.xml"), _T(_XML_FILENAME_PATH), FALSE,
// FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 0 ) )
// return false;
}
else
{
AfxMessageBox( _T( "No Connection to internet or ftp server found" ) );
return false;
}
if( true == CloseFtpConnection() )
AfxMessageBox( _T( "Connection to internet closed" ) );
else
AfxMessageBox( _T( "Connection to internet not closed" ) );
答案 0 :(得分:3)
清晰度是最重要的。很多时候,有多个返回点可以使程序流程不那么明显,因此更容易出错;但另一方面,有时早期的回报是显而易见的;他们的意思和目的很明确。所以我倾向于避免任何关于此的硬性规则。
如果您实际发布了要清理的代码,可能会获得更多里程。
答案 1 :(得分:1)
我们最近从“每种方法一种回归”风格切换到“有意义的回归”。这个转换的一部分是我们将方法中的行数限制为合理的(比如50行)。通过限制函数大小,代码变得更具可读性,并且多次返回是自然的,可读的和高性能的。
答案 2 :(得分:0)
您尚未指定编程语言。假设它是C ++:使用Boost's Smart Pointer。这不仅处理多个返回,还处理方法执行期间抛出的异常。如果使用Boost不是一个选项,那么创建自己的智能指针类应该很容易: - )