首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么简单地取消引用带有空赋值的指针并不是崩溃。

为什么简单地取消引用带有空赋值的指针并不是崩溃。
EN

Stack Overflow用户
提问于 2016-04-27 09:11:17
回答 2查看 184关注 0票数 2
代码语言:javascript
复制
 #include <iostream>
 int main()
 {
    int *ptr = NULL;
    // It does not crash
    *ptr; --------> Point-1
    //But this statment crashed
    std::cout<<"Null:"<<*ptr<<"\n"; ------> Point-2
    return 0;
 }

在上面的代码中,当我注释"Point-2“时,代码不会崩溃。但是当我不评论“点-2”的时候,它就崩溃了。由于ptr是空的,理想情况下,Point-1也会崩溃。如果我错了,请告诉我。有人能解释一下为什么当我只是取消指针的时候,代码没有崩溃吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 09:25:18

删除空指针是未定义的行为。未定义的行为不等于错误。如果您触发了未定义的行为,任何事情都可能发生。如果你问的是另一种方式:

为什么未定义的行为不会导致错误,而不是给我们带来奇怪的行为?

这可能是由于许多原因。原因之一是表现。例如,在std::vector的实现中(至少在MSVC中),没有检查索引是否超出了发布模式的范围。你可以尝试这样做:

代码语言:javascript
复制
std::vector<int> v(4);
v[4]=0;

它将编译并运行。你可能有奇怪的行为,也可能没有。但是,在调试模式下,它将在运行时抛出异常。MSVC在调试模式下进行签入,因为性能在调试模式中并不重要。但是它并不在发布模式中,因为性能很重要。

同样的情况也适用于取消引用空指针。您可以想象解除引用的代码将放在如下包装器中:

代码语言:javascript
复制
//Imaginary code
T& dereference(T* ptr){
    if(ptr==nullptr){
        throw;
    }
    return *ptr;
}

这一部分:if(ptr==nullptr){throw;}将减缓上下文中每个指针的取消引用过程,这是不可取的。

不过,可以这样做:

代码语言:javascript
复制
//Imaginary code
T& dereference(T* ptr){
    #ifdef DEBUG
    if(ptr==nullptr){
        throw;
    }
    #endif
    return *ptr;
}

我想你现在有主意了。

票数 2
EN

Stack Overflow用户

发布于 2016-04-27 09:28:42

在第2点中,您尝试显示0x0地址的内容,这会产生访问冲突错误。

在第1点中,您什么也不做,所以程序不必访问这个指针所描述的内存。这将不会产生访问权限违规错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36885299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档