Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无效取消引用空指针的规则是什么? P>这显然是与C++有关的,而不是一般的OOP。_C++_Oop_Pointers_Exception - Fatal编程技术网

无效取消引用空指针的规则是什么? P>这显然是与C++有关的,而不是一般的OOP。

无效取消引用空指针的规则是什么? P>这显然是与C++有关的,而不是一般的OOP。,c++,oop,pointers,exception,C++,Oop,Pointers,Exception,在什么情况下取消对空指针的引用是有效的,并且不会导致异常 除了结构和类的指针之外,是否还有其他东西可以成功地取消引用,即使它们是空指针 另外,为什么调用空指针函数而不访问其字段会在其他语言(如java)中引发异常 例如,在红黑树中,取消对空指针的引用是有意义的。空指针被认为是黑色的 class X { boolean isNull() { return this == null; } } public class Main { public static void main(

在什么情况下取消对空指针的引用是有效的,并且不会导致异常

除了结构和类的指针之外,是否还有其他东西可以成功地取消引用,即使它们是空指针

另外,为什么调用空指针函数而不访问其字段会在其他语言(如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());
    }
}

在这里,我认为将函数包含在
节点
类本身中更有意义,因为它与它相关。除了检查节点是否为空的逻辑之外,在其中包含所有与节点相关的逻辑不是很方便。

在Java中,对象声明是引用。因此,您可以向一个方法传递一个null引用,而这不会造成任何伤害,因为该方法可以检查引用是否指向null对象


但是对空引用调用方法将不起作用,因为该方法是在引用后面的对象上调用的。因为它是空的,所以方法不能调用任何对象,所以抛出了一个Null PoExtExchange。C++中的NulLPTR是一个未定义的行为,所以在试图取消引用NulLPTR(我的意思是:<强>任何< /强>:)时,任何技术都可能发生。 我认为对空指针的任何解引用都会导致异常

取消引用空指针是在C++中。< /P> C++不是Java。C++确实有例外,但它们只用于特殊的CAS,而不是在整个地方使用(如java)。您应该知道,不允许取消对空指针的引用,并且编译器假定它在正确的代码中从未发生过。如果仍然发生这种情况,则代码无效

阅读未定义的行为。当你想在C++中做任何严肃的事情时,必须了解它。

无效取消引用空指针的规则是什么

规则是:你不能这样做。当您这样做时,您的代码格式不正确,不需要进行诊断。这是另一种说法:您的代码具有未定义的行为。编译器不会发出错误或警告,当您要求编译器编译错误代码时,结果可能是任何东西

[C++中]空指针的有效解引用规则是什么

实际上,C++标准对于通过空指针间接寻址本身是否有效的问题有些不明确。这并不是明确禁止的。该标准使用“取消引用空指针”作为未定义行为的示例,但该示例已被删除

有一个活跃的核心语言问题,题为“是否通过空指针未定义的行为进行间接寻址?”这里讨论了这一点。它建议修改措辞,明确允许通过空指针进行间接寻址,甚至允许语言中的“空”引用。该问题产生于20年前,最近一次更新是在15年前,当时发现拟议的措辞不够充分


以下是几个例子:

#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;
}
在上面,间接寻址的结果被丢弃。在这种情况下,标准以某种方式对其有效性没有明确规定。拟议的措辞将明确允许这一点。这也是一个毫无意义的操作

X* ptr = nullptr;

*ptr;
如上所述,通过null进行间接寻址的结果绑定到左值。这是目前明确未定义的行为,但拟议的措词允许这样做

X& x = *ptr;
X* ptr2 = &x; // ptr2 == nullptr?
上面,间接寻址的结果经过左值到右值的转换。无论函数做什么,这都有未定义的行为,并且在CWG-232的建议解决方案中仍将保持未定义。这同样适用于您的所有示例


这样做的一个结果是
返回this==nullptr可以优化为
返回false因为<代码>这个< /C>在一个定义良好的程序中永远不会是空的。java:C++首先是两种不同的语言。第二个C++没有检查非法指针访问。第三,C++中有一些java中不存在的东西——未定义的行为。在爪哇中,<代码> null <代码>对象没有任何内容。methods@PaulMcKenzie恐怕它存在于任何语言中。Java只是尽力隐藏它,而C++编译器则尽量利用java中的这些“未定义行为”场景,在大多数情况下,java语言中的bug,而不是实际上与语言相关的问题。这几乎可能是一个单独的问题,但是答案是:
这个
从来都不是
空的
。写这篇文章的时候,试图找到一些UB:/我已经更新了这个问题,并包括了一个例子,其中取消引用空指针是有意义的。@StackExchange123我看到了这个例子,但坦率地说,这并不意味着什么sense@StackExchange123您谈论的主要是实现细节。这不是C++的工作原理。在C++中调用函数是不可能的。争论不会改变任何事情that@StackExchange123 . 一旦编译器发现您使用的是空指针,它就可以生成预期之外的代码。例如,编译器可能假设
永远不能为
null
,因此比较返回
,而不是
X& x = *ptr;
X* ptr2 = &x; // ptr2 == nullptr?
ptr->member_function();