呵呵哒( ̄▽ ̄)" 2024-02-02 15:06 采纳率: 66.7%
浏览 32
已结题

动态函数指针free报错

#include <iostream>
using namespace std;
#include <memory>
#include <stdlib.h>
int add(int a, int b) {
    return a + b;
}
/*
    动态函数指针是指在运行时根据需要动态分配和修改的函数指针
    它可以在程序运行时根据需要指向不同的函数,从而实现更加灵活
    和动态的函数调用
    在c++中,可以使用动态内存分配函数(如malloc或new)来创建
    动态函数指针
*/

int test02() {
    // 创建一个指向函数的指针
    int(*pFunc)(int, int);
    // 使用malloc动态分配内存
    int size = sizeof(int(*)(int, int));
    pFunc = (int(*)(int, int))malloc(size);
    // 将函数指针指向 add函数
    pFunc = add;
    // 调用函数
    int result = (*pFunc)(2, 3);
    cout << result << endl; // 输出 5
    // 释放内存
    free(pFunc);
    return 0;
}

int main() {
    test02();
    return 0;
}

free(pFunc)报错,请问该怎么解决呢?

D:\Work\c++\main.cpp:42:10: error: invalid conversion from 'int (*)(int, int)' to 'void*' [-fpermissive]
   42 |     free(pFunc);
      |          ^~~~~
      |          |
      |          int (*)(int, int)
In file included from D:/mingw64/include/c++/13.2.0/cstdlib:79,
                 from D:/mingw64/include/c++/13.2.0/ext/string_conversions.h:43,
                 from D:/mingw64/include/c++/13.2.0/bits/basic_string.h:4097,
                 from D:/mingw64/include/c++/13.2.0/string:54,
                 from D:/mingw64/include/c++/13.2.0/bits/locale_classes.h:40,
                 from D:/mingw64/include/c++/13.2.0/bits/ios_base.h:41,
                 from D:/mingw64/include/c++/13.2.0/ios:44,
                 from D:/mingw64/include/c++/13.2.0/ostream:40,
                 from D:/mingw64/include/c++/13.2.0/iostream:41,
                 from D:\Work\c++\main.cpp:1:
D:/mingw64/x86_64-w64-mingw32/include/stdlib.h:537:27: note:   initializing argument 1 of 'void free(void*)'
  537 |   void __cdecl free(void *_Memory);
      |                     ~~~~~~^~~~~~~
mingw32-make[2]: *** [CMakeFiles\app.dir\build.make:75: CMakeFiles/app.dir/main.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/app.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2
PS D:\Work\c++> cmake --build build
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.obj
D:\Work\c++\main.cpp: In function 'int test02()':
D:\Work\c++\main.cpp:38:10: error: invalid conversion from 'int (*)(int, int)' to 'void*' [-fpermissive]
   38 |     free(pFunc);
      |          ^~~~~
      |          |
      |          int (*)(int, int)
In file included from D:/mingw64/include/c++/13.2.0/cstdlib:79,
                 from D:/mingw64/include/c++/13.2.0/ext/string_conversions.h:43,
                 from D:/mingw64/include/c++/13.2.0/bits/basic_string.h:4097,
                 from D:/mingw64/include/c++/13.2.0/string:54,
                 from D:/mingw64/include/c++/13.2.0/bits/locale_classes.h:40,
                 from D:/mingw64/include/c++/13.2.0/bits/ios_base.h:41,
                 from D:/mingw64/include/c++/13.2.0/ios:44,
                 from D:/mingw64/include/c++/13.2.0/ostream:40,
                 from D:/mingw64/include/c++/13.2.0/iostream:41,
                 from D:\Work\c++\main.cpp:1:
D:/mingw64/x86_64-w64-mingw32/include/stdlib.h:537:27: note:   initializing argument 1 of 'void free(void*)'
  537 |   void __cdecl free(void *_Memory);
      |                     ~~~~~~^~~~~~~
mingw32-make[2]: *** [CMakeFiles\app.dir\build.make:75: CMakeFiles/app.dir/main.cpp.obj] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/app.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2
PS D:\Work\c++>
  • 写回答

4条回答 默认 最新

  • micthis 2024-02-02 15:36
    关注

    应该这样写:

    #include <iostream>
    using namespace std;
    #include <memory>
    #include <stdlib.h>
    int add(int a, int b) {
        return a + b;
    }
    /*
        动态函数指针是指在运行时根据需要动态分配和修改的函数指针
        它可以在程序运行时根据需要指向不同的函数,从而实现更加灵活
        和动态的函数调用
        在c++中,可以使用动态内存分配函数(如malloc或new)来创建
        动态函数指针
    */
    int test02() {
        // 创建一个指向函数的指针
        int(**pFunc)(int, int);
        // 使用malloc动态分配内存
        int size = sizeof(int(*)(int, int));
        pFunc = (int(**)(int, int))malloc(size);
        // 将函数指针指向 add函数
        *pFunc = add;
        // 调用函数
        int result = (*pFunc)(2, 3);
        cout << result << endl; // 输出 5
        // 释放内存
        free(pFunc);
        return 0;
    }
    int main() {
        test02();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月2日
  • 创建了问题 2月2日