我刚刚在代码中发现了一个令人讨厌的错误,因为我通过引用捕获了对字符串的 const 引用。当 lambda 运行时,原始字符串对象已经消失了,引用的值是空的,而目的是它包含原始字符串的值,因此出现了错误。
让我困惑的是,这并没有在运行时引发崩溃:毕竟,这不应该是未定义的行为,因为据我所知,存在悬空引用?此外,当在调试器下查看 id 时,它甚至看起来不像垃圾,而只是像正确构造的空字符串。
这是测试用例;这只是打印一个空行:
typedef std::vector< std::function< void() > > functions;
void AddFunction( const std::string& id, functions& funs )
{
funs.push_back( [&id] ()
{
//the type of id is const std::string&, but there
//is no object to reference. UB?
std::cout << id << std::endl;
} );
}
int main()
{
functions funs;
AddFunction( "id", funs );
funs[ 0 ]();
}
未定义的行为意味着没有要求应该发生什么。没有要求它应该崩溃。无论你的悬挂参考点指向什么内存,都没有理由这样做不应该包含看起来像空字符串的东西,并且它的析构函数似乎是合理的string
将记忆保留在该状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)