3

考虑以下代码:

int * p;

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

我知道指向一个可能被覆盖的值是不好的,但我记得读过有一种方法可以防止像 i 这样的值在声明时丢失,然后以这种方式指向。我已经翻遍了我的教科书,但很难找到详细说明这一点的确切文本,我开始认为我什至可能已经想象到了。有没有办法安全地指向函数内部声明的临时值?一种使临时值不再是临时的方法?

提前感谢您的所有帮助!

4

4 回答 4

4

我记得读过有一种方法可以防止像 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 中列出的一些例外)。

于 2013-04-10T21:42:21.807 回答
2

将 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)

于 2013-04-10T21:55:42.193 回答
1

的值i必须驻留在内存中的某个地方。如果在函数内部声明,很可能是在栈上分配的,函数返回时会丢失。如果您确实需要该值始终像示例中那样保持不变,那么您需要在函数外部将其声明为静态常量:

int * p;
static const int i = 7;

void Set()
{
    p = & i;
}

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

于 2013-04-10T21:48:56.207 回答
1

你可以使用static关键字。

#include <stdio.h>

int *p;

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

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

正确打印 7.

但是,除了对静态关键字和指针的研究之外,我强烈反对在任何情况下使用这样的代码。

于 2013-04-10T21:49:19.827 回答