reinterpret_cast std :: function *来往于void *

时间:2018-03-15 15:44:25

标签: c++ void-pointers std-function reinterpret-cast

当我在主要可执行文件中调用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;
}

即使我投射到原始类型,它仍然是分段的。谁能看到我出错的地方?

1 个答案:

答案 0 :(得分:16)

问题的原因与演员无关,因为该函数返回const string &。你需要:

using func_t = std::function<const std::string ()>;

正如评论所示,const这里没用,只是:

using func_t = std::function<std::string ()>;