当我在 C++ 中存储指向按值传递的参数的指针时会发生什么?
What happens when I store a pointer to a parameter passed-by-value in C++?
我有一个名为 Bucket 的 class,它基本上包含指向一些数据和一些标志的指针。使用下面的函数,可以将指针设置为数据(或者我希望如此)。
template <typename T>
void Bucket<T>::setData(T datum) {
m_data = &datum;
...
}
我想知道 m_data 中存储了什么,以及函数从调用堆栈弹出后会发生什么。我怀疑一旦数据超出范围,参考实际上就没有用了。如果是这样的话,动态分配传递给 setData 的数据并用 m_data 跟踪它会更好吗?
你的猜测是对的。当您调用该函数时,您传递给该函数的值存储在为该函数在堆栈上创建的局部变量(在本例中为函数参数变量)中。您正在使用指针来存储该局部变量的地址,一旦函数完成,局部变量将有效消失。在函数完成后使用指针检索该内存位置的值是未定义的。
您可以通过几种方式使用指针存储传递的值,包括:
- 动态分配新的 space 以按照您的建议复制和存储值
- 为函数调用使用指针并将指针存储在 class 中,使其指向保存值的内存(假设具有长期存储)
我有一个名为 Bucket 的 class,它基本上包含指向一些数据和一些标志的指针。使用下面的函数,可以将指针设置为数据(或者我希望如此)。
template <typename T>
void Bucket<T>::setData(T datum) {
m_data = &datum;
...
}
我想知道 m_data 中存储了什么,以及函数从调用堆栈弹出后会发生什么。我怀疑一旦数据超出范围,参考实际上就没有用了。如果是这样的话,动态分配传递给 setData 的数据并用 m_data 跟踪它会更好吗?
你的猜测是对的。当您调用该函数时,您传递给该函数的值存储在为该函数在堆栈上创建的局部变量(在本例中为函数参数变量)中。您正在使用指针来存储该局部变量的地址,一旦函数完成,局部变量将有效消失。在函数完成后使用指针检索该内存位置的值是未定义的。
您可以通过几种方式使用指针存储传递的值,包括:
- 动态分配新的 space 以按照您的建议复制和存储值
- 为函数调用使用指针并将指针存储在 class 中,使其指向保存值的内存(假设具有长期存储)