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
,访问它将引发异常不,不会。取消引用空指针会导致未定义的行为,与取消引用任何无效指针相同。