C++ 在C+中保存对语句块中声明的变量的引用是否安全+;?

C++ 在C+中保存对语句块中声明的变量的引用是否安全+;?,c++,C++,大概是这样的: void f() { int* p = NULL; if (condition) { int a = 3; p = &a; } // use p... } 如果没有,在什么情况下会出错 安全吗 不,它是不安全的,因为标准认为它是未定义的行为。在某事物的作用域过期后访问其内存意味着它可以等于任何东西 在什么情况下会出错 让我们看一下您当前的示例: void f() { int* p = N

大概是这样的:

void f()
{
    int* p = NULL;

    if (condition)
    {
        int a = 3;
        p = &a;
    }

    // use p...
}
如果没有,在什么情况下会出错

安全吗

不,它是不安全的,因为标准认为它是未定义的行为。在某事物的作用域过期后访问其内存意味着它可以等于任何东西

在什么情况下会出错

让我们看一下您当前的示例:

void f()
{
    int* p = NULL;

    if (condition)
    {
        int a = 3;
        p = &a;
    }
    int x = 5;
    // p may now point to x,
    // or some other variable on the stack,
    // or it might not do either and may point to invalid memory.
    // it depends on what your compiler decides to do.
    // this is what is meant by "undefined behavior."
}
在一个不相关的注释中,如果从未分配p,p仍然指向
NULL
,访问它将抛出异常

那么,还有什么选择呢?您有不止一个选项,但在我看来,这里有一个最简单的选项仍然保持相同的用法:

void f()
{
    int* p = NULL;

    if (condition)
    {
        p = new int{3};
        int& a = *p;
        // use a
    }

    // use p as you normally would, be sure to check for nullptr
    // you must delete p as well.
}
安全吗

不,它是不安全的,因为标准认为它是未定义的行为。在某事物的作用域过期后访问其内存意味着它可以等于任何东西

在什么情况下会出错

让我们看一下您当前的示例:

void f()
{
    int* p = NULL;

    if (condition)
    {
        int a = 3;
        p = &a;
    }
    int x = 5;
    // p may now point to x,
    // or some other variable on the stack,
    // or it might not do either and may point to invalid memory.
    // it depends on what your compiler decides to do.
    // this is what is meant by "undefined behavior."
}
在一个不相关的注释中,如果从未分配p,p仍然指向
NULL
,访问它将抛出异常

那么,还有什么选择呢?您有不止一个选项,但在我看来,这里有一个最简单的选项仍然保持相同的用法:

void f()
{
    int* p = NULL;

    if (condition)
    {
        p = new int{3};
        int& a = *p;
        // use a
    }

    // use p as you normally would, be sure to check for nullptr
    // you must delete p as well.
}

这是未定义的行为,简单明了。如果你使用
p
afterwords,编译器甚至可以自由地将你的程序变成垃圾。即使在某些情况下与某些编译器一起工作,这也是未定义的行为。编译器可以在块结束后立即重新使用堆栈的这一部分,并用任何东西填充它。看起来这个问题可能意味着要标记为C,因为它看起来像C代码。请澄清。这是未定义的行为,简单明了。如果你使用
p
afterwords,编译器甚至可以自由地将你的程序变成垃圾。即使在某些情况下与某些编译器一起工作,这也是未定义的行为。编译器可以在块结束后立即重新使用堆栈的这一部分,并用任何东西填充它。看起来这个问题可能意味着要标记为C,因为它看起来像C代码。请澄清。如果从未分配p,p仍然指向
NULL
,访问它将引发异常不,不会。取消引用空指针会导致未定义的行为,就像取消引用任何无效指针一样。如果从未分配p,p仍然指向
null
,访问它将引发异常不,不会。取消引用空指针会导致未定义的行为,与取消引用任何无效指针相同。