这是类中方法的代码片段:
....
std::string sHelper (sKey);
// interface keys definition with corresponding code implemented as lambda
std::vector<InterfaceOptionsResolve> vKeywords =
{
{
"{Instrument}",
[&] (const std::string sKeyword)
{
// sInstrument is a member in the class
sHelper.replace(sHelper.find(sKeyword), sKeyword.size(), sInstrument);
}
},
....
};
// check each interface template keyword against the provided interface template name
for ( const auto &itKeyword : vKeywords )
{
if ( strstr(sHelper.c_str(), itKeyword.sParameter.c_str()) )
{
// if the interface key was found replace it with the corresponding value
itKeyword.oLambda(itKeyword.sParameter);
}
}
....
简而言之:在方法函数中,我定义了一个带有关键字的std::vector
和一个为每个匹配关键字执行的lambda函数。我可以做几个if !strcmp(....) { the code from the lambda function }
,但我更喜欢这样。
当我将std::vector<InterfaceOptionsResolve> vKeywords =
的定义更改为static std::vector....
时,应用程序在多线程环境中崩溃(分段错误)。我不明白为什么。对我来说,只有lambda代码和const std::string
是static
,但是通过[&]
访问方法变量应该从活动范围内完成。
有人可以解释一下我的逻辑错误吗?
这里是InterfaceOptionsResolve
:
typedef struct
{
const std::string sParameter;
std::function<void(const std::string)> oLambda;
} InterfaceOptionsResolve;
答案 0 :(得分:2)
对我来说,只有lambda代码和
const std::string
是静态的,但是通过[&]
访问方法变量应该从活动范围内完成。
不,lambda表达式在首次初始化静态向量时运行,因此[&]
捕获将绑定对当前范围中sHelper
的引用。当您下次运行该函数时,sHelper
已消失,并且范围内有一个名为sHelper
的完全不同的对象,但您的静态lambda仍然引用旧的。