当我在 C++ 中存储指向按值传递的参数的指针时会发生什么情况?

What happens when I store a pointer to a parameter passed-by-value in C++?

提问人:TWal 提问时间:2/11/2018 最后编辑:Jive DadsonTWal 更新时间:2/11/2018 访问量:317

问:

我有一个名为 Bucket 的类,它基本上包含指向某些数据和一些标志的指针。使用下面的函数,可以设置指向数据的指针(或者我希望如此)。

    template <typename T>
    void Bucket<T>::setData(T datum) {
        m_data = &datum;
        ...
    }

我想知道m_data中存储了什么,以及函数从调用堆栈中弹出后会发生什么。我的怀疑是,一旦基准超出范围,参照实际上就毫无用处。如果是这样的话,动态分配传递给 setData 的数据并使用 m_data 进行跟踪会更好吗?

C++ 指针 作用域 按值传递

评论

2赞 zett42 2/11/2018
你的怀疑是正确的(尽管你错误地使用了这些术语)。你存储一个临时的地址(不是引用),在函数返回后,这将是一个悬空的指针
1赞 juanchopanza 2/11/2018
@JiveDadson 从发布的代码来看,它实际上是一个指针,而不是一个引用。m_data

答:

1赞 Daniel 2/11/2018 #1

你的怀疑是正确的。调用函数时,传递给函数的值存储在为该函数的堆栈上创建的局部变量(在本例中为函数参数变量)中。您正在使用指针来存储该局部变量的地址,一旦函数完成,该局部变量将有效地消失。在函数完成后,使用指针检索该内存位置的值是未定义的。

您可以通过以下几种方式使用指针存储传递的值,包括:

  1. 根据您的建议动态分配新空间以复制和存储值
  2. 使用指针进行函数调用,并将指针存储在类中,以便它指向保存值的内存(假设具有更长的存储)

评论

0赞 Daniel 2/11/2018
我不明白你的意思。本质上,的地址将存储在指针中,因为这是正在执行的操作。在该特定函数中,编译器可以优化 的使用 ,但这是推测性的,而且不能解决提出的问题。此外,可以在其他成员函数中使用,所以我不明白为什么编译器不会仍然存储地址,除非从未在其他任何地方使用过。datumm_datam_datam_datam_datam_data
0赞 Daniel 2/11/2018
根据定义,最后一部分是错误的。 并且没有相同的地址。它们分别存在于内存中的不同位置。指针引用与 (至少在本地堆栈上存在时) 相同的内存位置。如果传递给另一个函数,则该函数本身将给出与 .我所说的任何暗示引用和指针都不是一回事。m_datadatumm_datadatumdatumm_data*m_data