有没有办法安全地指向函数内部声明的临时值?

时间:2013-04-10 21:38:01

标签: c++ pointers

请考虑以下代码:

int * p;

void Set()
{
    int i = 7;
    p = & i; // potentially disastrous
}

我知道指向可能被覆盖的值很糟糕但我记得有一种方法可以防止像i这样的值在声明时丢失,然后以这种方式指向。我已经仔细检查了我的教科书,但却无法找到详细说明的文字,而且我开始认为我甚至可能已经想到了它。有没有办法安全地指向函数内部声明的临时值?一种使临时价值不再是暂时的方法吗?

提前感谢您的所有帮助!

4 个答案:

答案 0 :(得分:4)

  

我记得有一种方法可以防止像i这样的值在声明时丢失,然后用这种方式指出

与你提到的最接近的事情(如果我理解你的句子正确)是允许在绑定到引用时延长临时的生命周期的规则(§ 12.2 / 5的C ++ 11标准):

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节中列出)。

答案 1 :(得分:2)

将const ref暂时延伸到此临时值的临时延长时间,直到此const引用的范围结束,但是在您的示例中,您没有获取临时但本地自动对象i的地址。

所以要延长临时的生命周期:

const int& iref=int(3);
    int a= iref;
    //..do stuff with iref, i.e:
    printf("iref: %d\n", a);

输出:

  

iref:3

     

RUN SUCCESSFUL(总时间:46ms)

答案 2 :(得分:1)

i的值必须驻留在某处的内存中。如果在函数内部声明它,它很可能在堆栈上分配,并在函数返回时丢失。如果你真的需要值在你的例子中总是保持不变,那么你需要的是在函数外面将它声明为static const:

int * p;
static const int i = 7;

void Set()
{
    p = & i;
}

如果这不是您所需要的,也许您可​​以对最小的示例代码进行详细说明,以便我们更好地了解您要实现的目标。

答案 3 :(得分:1)

您可以使用static关键字。

#include <stdio.h>

int *p;

void set() {
    static int x = 7;
    p = &x;
}

int main(){
    set();
    printf("%d", *p);
}

正确打印7。

但是,除了对静态关键字和指针的研究之外,我强烈建议不要使用这样的代码。