当我在主要可执行文件中调用std :: function时,我在插件中遇到段错误,通过将其地址转换为void*
。我可以用几条自成一行的方式重现这个问题:
#include <iostream>
#include <functional>
int main()
{
using func_t = std::function<const std::string& ()>;
auto hn_getter = func_t{[]() {
return "Hello";
}};
auto ptr = reinterpret_cast<void*>(&hn_getter);
auto getter = reinterpret_cast<func_t*>(ptr);
std::cout << (*getter)() << std::endl; // Bang!
return EXIT_SUCCESS;
}
即使我投射到原始类型,它仍然是分段的。谁能看到我出错的地方?
答案 0 :(得分:16)
问题的原因与演员无关,因为该函数返回const string &
。你需要:
using func_t = std::function<const std::string ()>;
正如评论所示,const
这里没用,只是:
using func_t = std::function<std::string ()>;