【发布时间】:2020-10-02 06:55:44
【问题描述】:
#include <iostream>
struct X
{
bool isNull() { return this == nullptr; }
bool isNullConst() const { return this == nullptr; }
};
bool isNull(X& x) { return &x == nullptr; }
bool isNullConst(const X& x) { return &x == nullptr; }
// always false or exception.
bool isNullCopy(X x) { return &x == nullptr; }
int main()
{
X* x = nullptr;
std::cout << x->isNull() << '\n';
std::cout << (*x).isNull() << '\n';
std::cout << isNull(*x) << '\n';
// std::cout << isNull2(*x) << '\n'; // exception.
}
在这里,我知道X::isNull() 等价于isNull(X&),而X::isNullConst() 等价于isNullConst(const X&)。
我不知道的是,取消引用空指针是正常的。我认为对空指针的任何取消引用都会导致异常。
在玩了一会儿指针之后,我得出结论,取消引用空指针本身不是问题,问题在于尝试读取或写入空指针指向的地址。
由于函数位于内存中众所周知的位置,取消对类的空指针的引用并调用其中一个函数只会导致以空对象作为第一个参数调用函数。
这对我来说是新的,但这可能不是完整的画面。
起初我以为这是一个OOP概念,因此它应该在java中工作,但它在这里不起作用并导致异常(这让我想到为什么它在java中不起作用? ...):
class X
{
boolean isNull() { return this == null; }
}
public class Main {
public static void main(String[] args) {
X x = null;
System.out.println(x.isNull());
}
}
所以,显然这是与 C++ 相关的东西,而不是一般的 OOP。
在哪些情况下解除引用空指针有效且不会导致异常?
除了结构和类的指针之外,还有什么其他东西可以成功解引用,即使它们是空指针?
另外,为什么在不访问其字段的情况下调用空指针的函数会在其他语言(如 java)中引发异常?
例如,在红黑树中取消引用空指针是有意义的。空指针被认为是黑色的。
#define RED true
#define BLACK false;
struct Node
{
bool color;
bool isRed()
{
return this != nullptr && this->color == RED;
}
};
bool isRed(Node* node)
{
return node != nullptr && node->color == RED;
}
在这里,我认为将函数包含在Node 类本身中更有意义,因为它与它相关。将与节点相关的所有逻辑都包含在其中不是很方便,除了检查它是否为空的逻辑。
【问题讨论】:
-
首先,Java 和 C++ 是两种不同的语言。第二个 C++ 没有检查非法指针访问。第三,C++ 有一些 Java 中不存在的东西——未定义的行为。
-
在java中
null对象没有任何方法 -
@PaulMcKenzie afaik 它以任何语言存在。 Java 只是尽力隐藏它,而 C++ 编译器则尽力利用它
-
这些 Java 中的“未定义行为”场景,大部分情况下,不是 JVM 中的错误,而不是与语言相关的问题吗?
-
fwiw,您的编辑添加了一些全新的内容。这几乎可以是一个单独的问题,但答案是:
this永远不是NULL。
标签: c++ oop pointers exception