我想存储一个指向矢量元素的指针,该指针是在基于范围的for循环中选择的,所有这些都在静态上下文中显示。
但是,CLion给了我警告Address of local variable may escape the function
。
这是一个例子:
struct TestStruct
{
static std::vector<std::string> _values;
static const std::string* _selectedValue;
static void selectValue()
{
for (const std::string& value : _values)
{
if (value == "toto")
{
_selectedValue = &value; // The warning is here, on the "&value" part.
}
}
}
};
static
但是,删除三个关键字时,警告消失。
当我运行静态和非静态版本时,在两种情况下都可以正常工作,因为for循环使用对元素的引用。
为什么此警告出现在静态版本中?
关于静态变量的生存期是否有什么特别之处,可能使其无法正常工作?
该代码没有任何问题,因为它代表了对象生命周期。
CLion不是万能的-它不知道您的意图是什么。它所知道的是,您正在将局部变量(value
)的地址存储在静态var中,因此完全可以警告您“局部变量的地址可能会逸出函数”。这是否是一个问题,取决于您的意图,并且如代码所示,它看起来还不错。
我要提到的是,您在使用此结构时需要格外小心,因为向量的大多数修改都会导致指针开始指向另一个元素或无效的内存。通常,除非您在程序开始时对向量中的数据进行初始化并在退出程序之前将其关闭,而不进行任何临时更改,否则此代码非常容易出错。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句