int& fun()
{
int * temp = NULL;
return *temp;
}
在上述方法中,我正在尝试取消引用 NULL 指针。当我调用此函数时,它不会给出异常。我发现当返回类型是按引用时,如果它是按值,则它不会给出异常。即使将 NULL 指针的取消引用分配给引用(如下行),它也不会给出。
int* temp = NULL:
int& temp1 = *temp;
在这里我的问题是编译器在引用的情况下不做取消引用吗?
int& fun()
{
int * temp = NULL;
return *temp;
}
在上述方法中,我正在尝试取消引用 NULL 指针。当我调用此函数时,它不会给出异常。我发现当返回类型是按引用时,如果它是按值,则它不会给出异常。即使将 NULL 指针的取消引用分配给引用(如下行),它也不会给出。
int* temp = NULL:
int& temp1 = *temp;
在这里我的问题是编译器在引用的情况下不做取消引用吗?
取消引用空指针是未定义的行为。
未定义的行为意味着任何事情都可能发生,因此无法为此定义行为。
诚然,我将第 n 次添加此 C++ 标准引用,但似乎需要添加。
关于未定义的行为,
C++ 标准第 1.3.24 节指出:
允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。
注意:
另外,请注意:在函数内
使用返回的引用或指向局部变量的指针也是未定义的行为。您应该使用 new 在 freestore(heap) 上分配指针,然后返回指向它的引用/指针。
编辑:
正如@James McNellis 在评论中适当指出的那样,
如果不使用返回的指针或引用,则行为定义良好。
当你取消引用一个空指针时,你不一定会得到一个异常;所有可以保证的是行为是未定义的(这实际上意味着根本无法保证行为是什么)。
一旦对*temp
表达式求值,就不可能推断程序的行为。
不允许取消引用空指针,因此编译器可以生成代码,假设您不这样做。如果你仍然这样做,编译器可能会很好地告诉你,但它不是必须的。合同中规定你不能这样做。
在这种情况下,我敢打赌编译器会很好,并在编译时告诉你问题,如果你只是正确地设置了警告级别。
不要 * 一个空指针,它是 UB。(未定义的行为,你永远不能假设它会做任何事情,除了点燃你的狗并强迫你吃蘑菇,这会导致神话般的轶事)
Algol/C家族中空指针的一些历史和资料:http ://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer
未定义行为的示例和含义:http ://en.wikipedia.org/wiki/Undefined_behavior#Examples_in_C
我不确定我是否理解您要执行的操作。未定义 ** NULL** 指针的取消引用。
如果您想表明您的方法并不总是返回值,您可以将其声明为:
布尔乐趣(int &val);
或 stl 方式(类似于 std::map 插入):
std::pair<int, bool> fun();
或提升方式:
boost::optional<int> fun();