在C ++中测试空指针值

时间:2011-12-15 12:56:26

标签: c++ objective-c null

我不清楚如何在C ++中这样做。在Objective-C中,我可以用这种方式检查对象

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

myValue与null对象(由类方法返回)进行比较,因此这很有效,如果object有一个值,即使是nil,if语句也将返回true。< / p>

所以问题是如何正确测试空指针值,我这样做

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

但它不起作用。

4 个答案:

答案 0 :(得分:5)

在C ++中,实际上没有空值的概念,只有空指针。你无法比较那些不是NULL指针的东西。

答案 1 :(得分:0)

如果我是对的,你想检查空指针。这在C ++中实际上非常简单

Foo *pInstanc = new Foo;
if(pInstance)
{
    //do something with pInstance
}

答案 2 :(得分:0)

C ++中的指针实际上包含存储对象或数据的某个内存位置的地址。在这种情况下,“空指针”只是一个空的内存地址。这表示为零值。所以要检查它,你会写这样的东西:

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
}

答案 3 :(得分:0)

简短回答:这取决于。

更长的答案:首先你不能比较一个引用(如果myValue的类型是T&amp;),也不能比较堆栈分配的对象(如果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是一个大问题的原因之一。如果你想拥有与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 ++中的概念。