Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以安全地指向函数内部声明的临时值?_C++_Pointers - Fatal编程技术网

C++ 有没有一种方法可以安全地指向函数内部声明的临时值?

C++ 有没有一种方法可以安全地指向函数内部声明的临时值?,c++,pointers,C++,Pointers,考虑以下代码: int * p; void Set() { int i = 7; p = & i; // potentially disastrous } 我知道指向一个可能被覆盖的值是不好的,但我记得在阅读时,有一种方法可以防止像I这样的值在声明后以这种方式指向时丢失。我已经翻遍了我的课本,但很难找到详细阐述这一点的确切文本,我开始认为我甚至可能已经想象出来了。有没有一种方法可以安全地指向函数内部声明的临时值?使临时值i不再是临时值的一种方法 提前感谢您的帮助 我记

考虑以下代码:

int * p;

void Set()
{
    int i = 7;
    p = & i; // potentially disastrous
}
我知道指向一个可能被覆盖的值是不好的,但我记得在阅读时,有一种方法可以防止像I这样的值在声明后以这种方式指向时丢失。我已经翻遍了我的课本,但很难找到详细阐述这一点的确切文本,我开始认为我甚至可能已经想象出来了。有没有一种方法可以安全地指向函数内部声明的临时值?使临时值i不再是临时值的一种方法

提前感谢您的帮助

我记得在阅读时,有一种方法可以防止像I这样的值在声明并以这种方式指向时丢失

与您提到的内容最接近的(如果我正确理解您的句子)是一条规则,该规则允许在绑定到引用(C++11标准§12.2/5)时延长临时文件的生命周期:

然而,对于指针和非临时对象,都没有这样的规则

使临时值i不再是临时值的一种方法


在您的示例中,
i
而不是临时的:它是一个具有自动存储持续时间的对象。临时对象是一个对象,其生命期(通常)终止于创建它的完整表达式的末尾(上面提到的例外以及§12.2/4-5中列出的一些例外)。

i的值必须驻留在内存中的某个位置。如果在函数内声明它,它很可能会在堆栈上分配,并且在函数返回时会丢失。如果您确实需要像示例中那样始终保持常量,那么您需要在函数外部将其声明为static const:

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);
}
#包括
int*p;
空集(){
静态int x=7;
p=&x;
}
int main(){
set();
printf(“%d”,*p);
}
正确打印7


但是,我强烈反对在静态关键字和指针的研究中使用这样一段代码。

将const ref带到一个临时变量会将这个临时变量的liifetime延长到这个const reference范围的末尾,然而,在您的示例中,您并没有获取临时地址,而是获取本地自动对象
i

因此,要延长临时do的使用寿命,只需执行以下操作:

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

综合招聘分数:3

运行成功(总时间:46毫秒)


您可以将
i
声明为
static
,但实际上它与全局变量没有什么不同——它只是具有更有限的范围。您想象它(除非您考虑使用动态内存)给您的函数一个
int
返回值并返回
i
@cdhowie是的,我记得有一个这样的关键词被使用过……你的变量
I
不是通常所说的“临时”变量。它是
Set()
的本地对象,或者在标准语言中,它是具有自动存储持续时间的对象。C11中引入了“临时存储持续时间”这一概念,但它仅适用于涉及结构或联合中的数组的奇数情况。。。好的,谢谢大家!你们是救生员@user1800967:很高兴它有帮助:)但我是一个整数,不是一个整数object@user1800967在C++术语中,所有的东西都是一个“对象”——虽然在OOP中,“对象”一词通常是用来表示类类型的实例。@ USE1800 967:好,使用C++标准的术语,然后是:对象被定义为存储区域。除此之外,对象还具有其他属性,如持续时间、类型、名称等。对象的类型可以是
int
double
、或
std::string
、或
X
(等)。当你认为“对象”是类型为类类型的对象时,你可能是什么意思。我只是想知道是否有办法防止我丢失。通过这种方式,让指针指向它将是安全的。通过这种方式,它既不会被释放,也不会被其他代码覆盖其值。我只是不明白为什么你想要一个指向一个永远不会改变值的整数的指针。也许有一种完全不同的方法来解决你潜在的问题,不管它是什么。是的:我这样做是为了研究目的。我正在了解C++语言(从java中移动)的过程。
const int& iref=int(3);
    int a= iref;
    //..do stuff with iref, i.e:
    printf("iref: %d\n", a);