考虑以下代码:
int * p;
void Set()
{
int i = 7;
p = & i; // potentially disastrous
}
我知道指向一个可能被覆盖的值是不好的,但我记得读过有一种方法可以防止像 i 这样的值在声明时丢失,然后以这种方式指向。我已经翻遍了我的教科书,但很难找到详细说明这一点的确切文本,我开始认为我什至可能已经想象到了。有没有办法安全地指向函数内部声明的临时值?一种使临时值不再是临时的方法?
提前感谢您的所有帮助!
我记得读过有一种方法可以防止像 i 这样的值在声明时丢失,然后以这种方式指向
最接近您提到的内容(如果我正确理解了您的句子)是允许在绑定到引用时延长临时对象生命周期的规则(C++11 标准的第 12.2/5 节):
struct X { int x = 0; };
X foo() { return X(); }
int main()
{
X const& x = foo(); // The lifetime of the object bound to x is prolonged
x.x = 42; // This is OK
}
但是,指针和非临时对象都没有这样的规则。
一种使临时值不再是临时的方法?
在您的示例中,i
它不是临时的:它是一个具有自动存储持续时间的对象。临时对象是一个对象,其生命周期(通常)在创建它的完整表达式结束时终止(除了上面提到的例外以及 § 12.2/4-5 中列出的一些例外)。
将 const ref 设为临时会将此临时对象的生命周期延长到此 const 引用范围的末尾,但是在您的示例中,您没有获取临时对象而是本地自动对象的地址i
。
所以要延长临时的寿命,只需:
const int& iref=int(3);
int a= iref;
//..do stuff with iref, i.e:
printf("iref: %d\n", a);
输出:
参考:3
运行成功(总时间:46ms)
的值i
必须驻留在内存中的某个地方。如果在函数内部声明,很可能是在栈上分配的,函数返回时会丢失。如果您确实需要该值始终像示例中那样保持不变,那么您需要在函数外部将其声明为静态常量:
int * p;
static const int i = 7;
void Set()
{
p = & i;
}
如果这不是您所需要的,也许您可以详细说明您的最小示例代码,以便我们更好地理解您想要实现的目标。
你可以使用static
关键字。
#include <stdio.h>
int *p;
void set() {
static int x = 7;
p = &x;
}
int main(){
set();
printf("%d", *p);
}
正确打印 7.
但是,除了对静态关键字和指针的研究之外,我强烈反对在任何情况下使用这样的代码。