- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
正如标题所说,我知道 new 会抛出一个可以被捕获的异常,但是指针到底发生了什么?它变成NULL?我检查了一些关于 SO 的答案,但没有人解释过。检查下面的例子,指针保持在堆上?请提供有关此模式的完整信息
#include <windows.h>
#include <cstdlib>
#include <iostream>
using namespace std;
enum eReadMode
{
// READ_ONLY,
READ_WRITE,
// CREATE_FILE,
// CREATE_WRITE_FILE,
};
class CFileStatic
{
private:
FILE *m_File;
public:
CFileStatic( LPCTSTR szFileName, eReadMode eMode );
virtual ~CFileStatic() {};
bool IsValidFile() const { return( m_File != NULL ); };
void PrintFile( unsigned int uLine = 0 );
};
CFileStatic::CFileStatic( LPCTSTR szFileName, eReadMode eMode )
{
if( szFileName )
{
if( eMode == READ_WRITE )
m_File = fopen( szFileName, "r+" );
else
printf( "Valid usage of: READ_WRITE only" );
}
else
m_File = NULL;
}
void CFileStatic::PrintFile( unsigned int uLine )
{
static unsigned uFindNumber;
if( uLine == 0 )
{
char szBuffer[1024];
while( fgets( szBuffer, 1024, m_File ) )
{
std::cout << szBuffer;
}
}
else
{
char szBuffer[1024];
while( fgets( szBuffer, 1024, m_File ) )
{
uFindNumber++;
if( uFindNumber == uLine )
{
std::cout << szBuffer;
}
}
}
}
int main( int argc, char *argv[] )
{
//if new fails, what 'pFile' turns out to be? and do I need to delete
//it later?
CFileStatic *pFile = new CFileStatic( "Console.h", READ_WRITE );
if( pFile->IsValidFile() )
{
pFile->PrintFile(2);
}
CFileStatic *pConsoleCpp = new CFileStatic( "Console.cpp", READ_WRITE );
if( pConsoleCpp->IsValidFile() )
{
pConsoleCpp->PrintFile();
}
system("pause>nul");
return EXIT_SUCCESS;
}
最佳答案
假设您正在使用默认的全局 new
运算符,并且没有使用 new
的 nothrow
版本:
int main( int argc, char *argv[] )
{
//if new fails, what 'pFile' turns out to be? and do I need to delete
//it later?
CFileStatic *pFile = new CFileStatic( "Console.h", READ_WRITE );
/* ... */
}
没有“后来”。在这段代码中,如果 new
失败,它将抛出一个 std::bad_alloc
异常,您的程序将立即终止。
现在,如果您要尝试处理这种情况,则需要捕获该异常。大概是这样的:
int main( int argc, char *argv[] )
{
//if new fails, what 'pFile' turns out to be? and do I need to delete
//it later?
try
{
CFileStatic *pFile = new CFileStatic( "Console.h", READ_WRITE );
}
catch( const std::bad_alloc& ex )
{
cout << "whoops! out of memory." << ex.what() << endl;
}
/* ... */
}
pFile
存在于 try
block 所包含的范围内,因此它不再存在。移出一层:
CFileStatic * pFile = 0;
try
{
pFile = new CFileStatic( "Console.h", READ_WRITE );
}
catch( const std::bad_alloc& ex )
{
cout << "whoops! out of memory." << ex.what() << endl;
}
// pFile is still 0
pFile
从未被修改,因此值不变。
关于delete
指针的问题。标准说 (C++03 5.3.5/2):
[...] if the value of the operand of delete is the null pointer the operation has no effect.
您不必删除 NULL 指针,因为没有什么可删除
,但这样做不会有任何效果。你可以安全地这样做:
CFileStatic * pFile = 0;
try
{
pFile = new CFileStatic( "Console.h", READ_WRITE );
}
catch( const std::bad_alloc& ex )
{
cout << "whoops! out of memory." << ex.what() << endl;
}
delete pFile; // regardless of the success of new, this is OK
请注意,执行此操作时,将 pFile
初始化为空指针尤为重要,正如我在此处所做的那样。如果你不这样做:
CFileStatic* pFile; // NO INIT
/* ... */
delete pFile; // if new threw, this is undefined behavior
pFile
仍然是垃圾指针。它不是空指针,因此 delete
将尝试删除它,从而导致未定义的行为。
关于c++ - 如果 new 失败,是否需要检查指针有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11089986/
网站的日常维护通常涉及验证链接是否有效、标记不良链接等。 我知道如何通过脚本匹配电子邮件地址(尤其是在它们位于 mailto: 链接中的网页上下文中)。我的问题是如何在不向地址发送垃圾邮件的情况下验证
我正在尝试将大型 UInt16 数组保存到文件中。 positionCnt大约是50000,stationCnt大约是2500。直接保存,没有GZipStream,文件大约250MB,可以通过外部zi
我正在寻找表格方面的 HTML5 规范。我正在做一个有很多数据表的网络应用程序。 这些表通常有一个数据库行映射到一个表行。一切都很好。然而,一个特定的问题 child 有太多的列,需要将其分布在表中的
我目前正在研究用于客户端目的的Azure流媒体服务,我想知道是否有一种方法可以为自适应流媒体创建时间有限的URL(出于安全目的,我们需要这个,当用户想要流媒体时,我们会验证权限)创建限时 URL)。我
我目前正在研究用于客户端目的的Azure流媒体服务,我想知道是否有一种方法可以为自适应流媒体创建时间有限的URL(出于安全目的,我们需要这个,当用户想要流媒体时,我们会验证权限)创建限时 URL)。我
我想做的是测试我编写的一些 Lucene 代码,并且想要一些有关使用 JUnit 进行测试时的最佳实践的信息。顺便说一句,Lucene 是一个搜索引擎,您可以使用它创建一个平面文件来索引一堆数据。 所
我有一个 .net 核心应用程序,我在注册后创建了一个电子邮件 token ,然后通过电子邮件发送它。这个想法是,用户可以在客户端应用程序中使用该电子邮件 token ,我想检查它的有效性(如果它过期
我的印象是使用 javascript 经常破坏 W3C xhtml/css 有效性。这是真的?如果是这样,为什么我可以在我的网页中使用 javascript 并且仍然使它们符合 W3C 标准(html
我简直是在绞尽脑汁想弄明白这个问题。给定一个无向连通图 G , G 中的所有边都具有未知成本,但已知每条边的每个成本的区间,例如边 e 的成本在闭区间 [i,j] 中,其中 i 和 j 是实数。我还得
检查 URL 有效性的一种直接方法是简单地处理 MalformedURLException 异常: try { URL base = new URL(SomeString); } catch (M
如何在 shell 脚本中检查 0.0.0.0 到 255.255.255.255 范围内的 IP 地址的有效性? 最佳答案 如果您使用的是 bash,则可以对模式进行简单的正则表达式匹配,而无需验证
我已成功通过我的 Angular 应用程序中的 Azure AD ( https://login.microsoftonline.com/ {tenantId}/oauth2/v2.0/authori
我已经获得了文件:一个 .der- 和一个 .p12-文件,以及一个 key 对,我们应该用它来在 Java 代码中创建和验证数字签名。 我必须将两个 key 保存在 MySql-Database-T
我一直在关注 this使用 lumen 和 vuejs 进行身份验证的教程。我正在使用 this库(tymon/jwt-auth)。 一切正常。我的 API 为我的数据处理所有事情,并为我的前端框架提
我想知道,但是引用交易必须在过去 730 天内发生,因为账单协议(protocol) ID 可能在两年后不可用。因此,如果第一笔交易在到期前完成,可以说是在 600 天之后,那么 ID 将在 130
std::string.npos 曾经有效吗? (与正确的 std::string::npos 相反。) 我在我正在处理的一个旧项目中经常看到它,它不能用 VS2010 编译。 它是前标准时代的东西吗
我正在使用 Passport 来验证用户进入我的应用程序 我已经为此创建了一个通行证策略 passport.use(new GoogleStrategy({ clientID: process
我正在使用来自 API 的 URL,其中搜索词用引号括起来。例如:http://www.example.com/searchterm="搜索"。 但是,由于引号,我的 NSURL(由 URLWithS
有谁知道 GitLab 上 OAuth 访问 token 的有效期是多少? 至少需要 12 小时(根据经验),但我想确定一下,所以我不会不必要地刷新 token 。 PS:亚搏体育app ...如果在
使用 FirebaseStorage 的 getDownloadUrl 时,我对 url(&token=) 中的“ token ”有疑问。 https://firebasestorage.google
我是一名优秀的程序员,十分优秀!