在c++中测试空指针值
Test for a null pointer value in C++
我不清楚如何在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
}
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 在c++中测试空指针值