为什么函数指针的强制转换和基础类型的强制转换表现不一致?
问题原因分析
基础类型转换合法的原因
你给出的基础类型指针转换代码本质是同类型指针互转:
int* b = new int(40); int c = *(int *)b;
b本身就是int*类型,强转成int*属于无意义的空转,解引用后拿到的确实是指针指向的有效int值,所以运行完全正常。
函数指针转换失败的核心原因
std::function是C++标准库提供的可调用对象包装类模板,它的实例是一个标准库类对象,和原生函数指针是完全没有继承关系的独立类型:
// abc的类型是 void(*)(int),是原生函数指针 void abc(int a){ cout<<a<<endl; } // 这里的转换是完全非法的未定义行为 std::function<void(int)> callback = *(std::function<void(int)>*)abc;
这里的错误有两层:
- 你直接把原生函数指针的值(指向函数代码段的地址)强转成
std::function<void(int)>类型的指针,相当于把代码段的内存地址当成了存储std::function对象的内存地址,二者的内存布局完全不兼容 - 对这个非法指针解引用时,会直接读取代码段的内存当成类对象数据处理,轻则触发程序崩溃,重则出现完全不可预期的运行异常。
正确写法
std::function本身支持直接赋值兼容签名的原生函数指针,不需要任何强转:
std::function<void(int)> callback = abc;
内容的提问来源于stack exchange,提问作者Bhargav Sonu
相关产品推荐
相关产品推荐

