提问人:TWal 提问时间:2/11/2018 最后编辑:Jive DadsonTWal 更新时间:2/11/2018 访问量:317
当我在 C++ 中存储指向按值传递的参数的指针时会发生什么情况?
What happens when I store a pointer to a parameter passed-by-value in C++?
问:
我有一个名为 Bucket 的类,它基本上包含指向某些数据和一些标志的指针。使用下面的函数,可以设置指向数据的指针(或者我希望如此)。
template <typename T>
void Bucket<T>::setData(T datum) {
m_data = &datum;
...
}
我想知道m_data中存储了什么,以及函数从调用堆栈中弹出后会发生什么。我的怀疑是,一旦基准超出范围,参照实际上就毫无用处。如果是这样的话,动态分配传递给 setData 的数据并使用 m_data 进行跟踪会更好吗?
答:
1赞
Daniel
2/11/2018
#1
你的怀疑是正确的。调用函数时,传递给函数的值存储在为该函数的堆栈上创建的局部变量(在本例中为函数参数变量)中。您正在使用指针来存储该局部变量的地址,一旦函数完成,该局部变量将有效地消失。在函数完成后,使用指针检索该内存位置的值是未定义的。
您可以通过以下几种方式使用指针存储传递的值,包括:
- 根据您的建议动态分配新空间以复制和存储值
- 使用指针进行函数调用,并将指针存储在类中,以便它指向保存值的内存(假设具有更长的存储)
评论
0赞
Daniel
2/11/2018
我不明白你的意思。本质上,的地址将存储在指针中,因为这是正在执行的操作。在该特定函数中,编译器可以优化 的使用 ,但这是推测性的,而且不能解决提出的问题。此外,可以在其他成员函数中使用,所以我不明白为什么编译器不会仍然存储地址,除非从未在其他任何地方使用过。datum
m_data
m_data
m_data
m_data
m_data
0赞
Daniel
2/11/2018
根据定义,最后一部分是错误的。 并且没有相同的地址。它们分别存在于内存中的不同位置。指针引用与 (至少在本地堆栈上存在时) 相同的内存位置。如果传递给另一个函数,则该函数本身将给出与 .我所说的任何暗示引用和指针都不是一回事。m_data
datum
m_data
datum
datum
m_data
*m_data
评论
m_data