这是什么意思"!somePointer"?

Cod*_*rJL 3 c++ pointers

所以阅读一些代码,并且有一种我不理解的语法.

代码是这样的

int * aPtr = new int();
if(!aPtr)               // this part I don't understand
{
 //some code here
}
Run Code Online (Sandbox Code Playgroud)

我猜测语法是询问指针是否指向null,但在我读过的大多数书中,通常都是这样说的

if(aPtr == NULL)
{

}
Run Code Online (Sandbox Code Playgroud)

mas*_*oud 6

你的问题中有三点重要

 

1.它是空的吗?

空指针的计算结果为零:

空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零 ...(§4.10/ 1)

因此,要检查指针是否为空,可以将其检查为零.传统方式(来自C的遗留)来检查变量是否为零

if (!var)  // if (var == 0)
Run Code Online (Sandbox Code Playgroud)

 

2.什么是宏NULL

它是一个积分常数表达式,其计算结果为零,但是......忘记使用NULL,使用0nullptr替代.有关更多信息,请阅读"我应该使用NULL还是0?"


 

3.如何检查new失败与否?

...当C++程序将空指针结果作为错误指示而不是bad_alloc异常时,它由新表达式的放置版本调用.(18.6.1.1/5)

int *aPtr = new int();
if(!aPtr)
Run Code Online (Sandbox Code Playgroud)

您似乎想要检查是new成功还是失败.这是错误的,因为如果失败则抛出一个异常,程序将无法到达if (!aPtr).因此,你应该处理它try/catch.

此外,您可以强制编译器停止抛出异常并返回null.为此,你应该尝试:

int* aPtr = new(std::nothrow) int();
Run Code Online (Sandbox Code Playgroud)