int& fun()
{
int * temp = NULL;
return *temp;
}
在上面的方法中,我试图取消引用NULL指针。当我调用此函数时,它不会给出异常。我发现当返回类型是引用时它不会给出异常,如果它是按值,那么它。即使取消引用NULL指针被引用(如下面的行),它也不会给出。
int* temp = NULL:
int& temp1 = *temp;
我的问题是,在引用的情况下编译器是否进行解除引用?
答案 0 :(得分:16)
取消引用空指针是未定义行为。
未定义的行为意味着任何事情都可能发生,因此无法为此定义行为。
不可否认,我将在第n次添加此C ++标准引用,但似乎需要。
关于未定义的行为,
C ++标准第1.3.24节声明:
允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。
注意:强>
另外,只是为了引起你的注意:
使用返回的引用或指向函数内部局部变量的指针也是未定义的行为。你应该使用new在freestore(heap)上分配指针,然后返回一个引用/指针。
修改强>
正如@James McNellis,在评论中恰当地指出,
如果未使用返回的指针或引用,则行为定义良好。
答案 1 :(得分:7)
取消引用空指针时,不一定会得到异常;所有保证的是行为是未定义的(这实际上意味着根本不保证行为是什么)。
评估*temp
表达式后,无法推断程序的行为。
答案 2 :(得分:4)
您不允许取消引用空指针,因此编译器可以生成代码,假设您不这样做。无论如何,如果你这样做,编译器可能会很好并告诉你,但它没有必要。合同的一部分是你不能这样做。
在这种情况下,我打赌编译器将很好并且在编译时已经告诉你问题,如果你只是正确设置了警告级别。
答案 3 :(得分:1)
不要*空指针,它是UB。 (未定义的行为,你永远不能认为它会做任何事情都不会点燃你的狗着火并强迫你采取shrooms,这将导致愚蠢的轶事)
Algol / C系列中空指针的一些历史和信息:http://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer
未定义行为的示例和含义:http://en.wikipedia.org/wiki/Undefined_behavior#Examples_in_C
答案 4 :(得分:0)
我不确定我明白你在尝试做什么。未定义** NULL **指针的解除引用。
如果您想表明您的方法并不总是返回值,您可以将其声明为:
bool fun(int& val);
或stl方式(类似于std :: map insert):
std::pair<int, bool> fun();
或提升方式:
boost::optional<int> fun();