You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用非const成员函数指针程序崩溃,如何修改代码解决?

解决非const成员函数调用时的崩溃问题

嘿,我一眼就看出问题所在了——你的程序崩溃是因为野指针访问无效内存,那个退出码3221225477其实就是Windows系统的访问违规错误(Access Violation)。咱们一步步拆解问题,再给出修正方案:

问题根源分析

  1. 未初始化的野指针:在callFunctionOnMultipleObjects函数里,你声明了Test *test;但完全没给它分配有效内存,这个指针指向的是随机的无效地址。调用testFunction1时,因为没有修改成员变量,只是输出文本,碰巧没触发崩溃;但调用testFunction2修改testVal时,相当于往一块不属于你的内存写数据,系统直接触发保护机制崩溃了。
  2. 非静态成员的错误访问:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:27:29