调用非const成员函数指针程序崩溃,如何修改代码解决?
解决非const成员函数调用时的崩溃问题
嘿,我一眼就看出问题所在了——你的程序崩溃是因为野指针访问无效内存,那个退出码3221225477其实就是Windows系统的访问违规错误(Access Violation)。咱们一步步拆解问题,再给出修正方案:
问题根源分析
- 未初始化的野指针:在
callFunctionOnMultipleObjects函数里,你声明了Test *test;但完全没给它分配有效内存,这个指针指向的是随机的无效地址。调用testFunction1时,因为没有修改成员变量,只是输出文本,碰巧没触发崩溃;但调用testFunction2修改testVal时,相当于往一块不属于你的内存写数据,系统直接触发保护机制崩溃了。 - 非静态成员的错误访问:你的
callTestFunction是普通成员变量,却用Test::callTestFunction来访问,这在编译阶段就应该报错了,必须把它声明为static成员才能通过类名访问。
修正后的完整代码
下面是修复后的代码,同时优化了成员函数指针的调用方式:
#include <functional> #include <iostream> struct Test { int testVal = 0; /* Call a given function on 10 separate objects */ void callFunctionOnMultipleObjects(void (Test::*func)()) { for(int i=0;i < 10; i++) { Test test; // 栈上创建有效的Test对象,循环结束自动销毁 // 用lambda包装成员函数指针,适配std::function的签名 callTestFunction = [func](Test* t) { (t->*func)(); // 正确调用成员函数的语法 }; callTestFunction(&test); std::cout << "Object " << i << " testVal: " << test.testVal << "\n"; } std::cout << "**************** \n"; } /* Test Functions */ void testFunction1(){ std::cout << "some const/static action \n"; } void testFunction2(){ std::cout << "non const/static action \n"; testVal ++; } static std::function<void(Test *)> callTestFunction; // 声明为static成员 }; // 必须在类外部定义static成员变量 std::function<void(Test *)> Test::callTestFunction; int main() { Test test; test.callFunctionOnMultipleObjects(&Test::testFunction1); test.callFunctionOnMultipleObjects(&Test::testFunction2); return 0; }
关键修改点
- 替换野指针为有效对象:用栈上的
Test test;替代未初始化的Test *test;,每次循环都创建一个合法的Test实例,修改testVal时操作的是有效内存。 - 修正静态成员访问:把
callTestFunction声明为static,确保可以通过Test::访问。 - 正确包装成员函数指针:用lambda表达式把成员函数指针转换成
std::function能接受的形式,避免直接赋值的类型不匹配问题。
额外需求适配:如果要在同一个对象上调用10次
如果你的真实需求是在同一个指定对象(比如main里的test)上调用10次成员函数,那代码可以更简洁,甚至不需要callTestFunction这个static成员:
void callFunctionOnMultipleObjects(void (Test::*func)()) { for(int i=0;i < 10; i++) { (this->*func)(); // 直接在当前对象上重复调用 } std::cout << "Final testVal: " << testVal << "\n**************** \n"; }
这样运行后,testFunction2会把testVal累计加到10,完全不会崩溃。
内容的提问来源于stack exchange,提问作者MNCODE
相关产品推荐
相关产品推荐

