在c++中测试空指针值

Test for a null pointer value in C++

本文关键字:空指针 测试 c++      更新时间:2023-10-16

我不清楚如何在c++中做到这一点。在Objective-C中,我可以这样检查对象

if (myValue != [NSNull null]) { … }

myValue与null对象(由类方法返回)进行比较,所以这工作得很好,如果对象有值,即使是nil, if语句将返回true

那么问题是如何正确地测试空指针值,我这样做了

if (myValue != NULL)
{
    qDebug() << "It is not null";
}

在c++中没有空值的概念,只有空指针。你不能比较不是指向NULL的指针

c++中的指针本质上包含了存储对象或数据的内存位置的地址。在这种情况下,"NULL指针"只是一个空的内存地址。这被表示为零值。为了检查,你可以这样写:

SomeClass *someClassPointer = // ... call some method to get pointer
// Check for null pointer
if (someClassPointer == 0)
{
    // Pointer is null
}

可以这样简化:

if (someClassPointer)
{
    // For checking that the pointer is not null
}
if (!someClassPointer)
{
    // For checking that a pointer is null
}

简短的回答:看情况。

更长的回答:首先,你不能比较引用(如果myValue的类型类似于T&)或堆栈分配对象(如果myValue只是T)为null -这些类型总是被分配而不是null(除非你搞砸了堆栈或做了其他坏事-但你不会检查这些情况,因为那样你会有更大的问题)。

唯一可以检查null的类型是指针(myValue是T*类型的东西)。对于这些类型:

  • 如果你使用c++ 98,你可以检查0。NULL通常只是宏(#define NULL 0)。
  • 如果你使用新的c++ 11,有一个新的nullptr关键字,你应该检查这个。

由于0的值为false,其他值为true,因此也可以像普通bool类型一样使用该指针。nullptr的类型是nullptr_t,并且实现了bool()操作符——所以你也可以像使用bool一样使用它。

一般来说:在c++ 98中,缺少nullptr是错误的来源,所以如果你可以使用c++ 11,总是使用nullptr -永远不要使用NULL或0 (int只是分配给指针或与指针进行比较的错误类型-如果你有重载方法,你会遇到问题,因为编译器会使用带int参数的方法,而不是指针类型,如果合适的话)。

让我们假设你有两个函数:

void foo(int a);
void foo(void *);

如果你现在调用

foo(NULL);

第一个函数将被调用(可能不是您想要的)。在c++ 11中,你可以这样写:

foo(nullptr);

而在c++ 98中,你必须写:

foo((void *)0);

这就是为什么在c++ 98之前缺少null is/是一个大问题的原因之一。如果你想有类似于Objective-C的东西,你可以写下面的函数(c++ 98):

template<typename T>
inline bool isNull(const T *obj) {
  return obj == ((const T *) 0);
}
// to use it:
if (isNull(myType)) { //myType is a pointer to something
  // some code
}

尽管我从未见过在实践中使用过。

如果我是对的,你想检查空指针。这在c++

中非常简单
Foo *pInstanc = new Foo;
if(pInstance)
{
    //do something with pInstance
}