13
int&  fun()
{
    int * temp = NULL;
    return *temp;
}

在上述方法中,我正在尝试取消引用 NULL 指针。当我调用此函数时,它不会给出异常。我发现当返回类型是按引用时,如果它是按值,则它不会给出异常。即使将 NULL 指针的取消引用分配给引用(如下行),它也不会给出。

int* temp = NULL:
int& temp1 = *temp;

在这里我的问题是编译器在引用的情况下不做取消引用吗?

4

5 回答 5

17

取消引用空指针是未定义的行为

未定义的行为意味着任何事情都可能发生,因此无法为此定义行为。

诚然,我将第 n 次添加此 C++ 标准引用,但似乎需要添加。

关于未定义的行为,

C++ 标准第 1.3.24 节指出:

允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。

注意:
另外,请注意:在函数内
使用返回的引用或指向局部变量的指针也是未定义的行为。您应该使用 new 在 freestore(heap) 上分配指针,然后返回指向它的引用/指针。

编辑:
正如@James McNellis 在评论中适当指出的那样,
如果不使用返回的指针或引用,则行为定义良好

于 2011-07-16T07:45:06.563 回答
7

当你取消引用一个空指针时,你不一定会得到一个异常;所有可以保证的是行为是未定义的(这实际上意味着根本无法保证行为是什么)。

一旦对*temp表达式求值,就不可能推断程序的行为。

于 2011-07-16T07:44:35.720 回答
4

不允许取消引用空指针,因此编译器可以生成代码,假设您不这样做如果你仍然这样做,编译器可能会很好地告诉你,但它不是必须的。合同中规定你不能这样做。

在这种情况下,我敢打赌编译器很好,并在编译时告诉你问题,如果你只是正确地设置了警告级别。

于 2011-07-16T08:31:14.683 回答
1

不要 * 一个空指针,它是 UB。(未定义的行为,你永远不能假设它会做任何事情,除了点燃你的狗并强迫你吃蘑菇,这会导致神话般的轶事)

Algol/C家族中空指针的一些历史和资料:http ://en.wikipedia.org/wiki/Pointer_(computing)#Null_pointer

未定义行为的示例和含义:http ://en.wikipedia.org/wiki/Undefined_behavior#Examples_in_C

于 2011-07-16T07:49:53.347 回答
0

我不确定我是否理解您要执行的操作。未定义 ** NULL** 指针的取消引用。

如果您想表明您的方法并不总是返回值,您可以将其声明为:

布尔乐趣(int &val);

或 stl 方式(类似于 std::map 插入):

std::pair<int, bool> fun();

或提升方式:

boost::optional<int> fun();
于 2011-07-16T07:50:57.720 回答