#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也会崩溃。如果我错了,请告诉我。有人能解释一下为什么当我只是取消指针的时候,代码没有崩溃吗?
发布于 2016-04-27 09:25:18
删除空指针是未定义的行为。未定义的行为不等于错误。如果您触发了未定义的行为,任何事情都可能发生。如果你问的是另一种方式:
为什么未定义的行为不会导致错误,而不是给我们带来奇怪的行为?
这可能是由于许多原因。原因之一是表现。例如,在std::vector的实现中(至少在MSVC中),没有检查索引是否超出了发布模式的范围。你可以尝试这样做:
std::vector<int> v(4);
v[4]=0;它将编译并运行。你可能有奇怪的行为,也可能没有。但是,在调试模式下,它将在运行时抛出异常。MSVC在调试模式下进行签入,因为性能在调试模式中并不重要。但是它并不在发布模式中,因为性能很重要。
同样的情况也适用于取消引用空指针。您可以想象解除引用的代码将放在如下包装器中:
//Imaginary code
T& dereference(T* ptr){
if(ptr==nullptr){
throw;
}
return *ptr;
}这一部分:if(ptr==nullptr){throw;}将减缓上下文中每个指针的取消引用过程,这是不可取的。
不过,可以这样做:
//Imaginary code
T& dereference(T* ptr){
#ifdef DEBUG
if(ptr==nullptr){
throw;
}
#endif
return *ptr;
}我想你现在有主意了。
发布于 2016-04-27 09:28:42
在第2点中,您尝试显示0x0地址的内容,这会产生访问冲突错误。
在第1点中,您什么也不做,所以程序不必访问这个指针所描述的内存。这将不会产生访问权限违规错误。
https://stackoverflow.com/questions/36885299
复制相似问题