微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何分配和释放函数指针数组并保持 valgrind 快乐?

如何解决如何分配和释放函数指针数组并保持 valgrind 快乐?

如何在 C++ 中分配和释放函数指针数组?我尝试了两种不同的策略,第一种使用单指针,第二种使用双指针,但我似乎无法让 valgrind 高兴。这是我的情况:

// function pointer
typedef double(*function_ptr)(double);

// function that adhers to the interface set by function_ptr
double do_nothing(double x) {
    return x;
}

// dynamically create array of @param size function pointers,all pointing to do_nothing
function_ptr **make_function_ptr(int size) {
    function_ptr xp = &do_nothing_transform;
    function_ptr* xpp = &xp;
    auto **trsfm = (ESfcnTrsfm **) malloc(sizeof(function_ptr *));
    for (int i = 0; i < size; i++) {
        trsfm[i] = (ESfcnTrsfm*) malloc(sizeof(function_ptr));
        trsfm[i] = xpp; // same as trsfm[i] = ...
    }
    return trsfm;
}

// free the array of function pointers
void free_function_ptr(function_ptr  **fun,int size) {
    for (int i=0; i<size; i++){
        free(fun[i]);
        fun[i] = nullptr;
    }
    free(fun);
    fun = nullptr;
}

解决方法

您的 make_function_ptr 函数在“外部”表中为仅一个 function_ptr 分配空间,而不是为 size 指针分配空间。所以,这:

    auto **trsfm = (ESfcnTrsfm **) malloc(sizeof(function_ptr *));

应该是:

    auto **trsfm = (ESfcnTrsfm **) malloc(sizeof(function_ptr *) * size); // Need to multiply by "size"

没有这个,当 trsfm[i] 不是零时,后续 for 循环中的 i 访问是未定义的行为。

此外(如评论中所指出的),您在该 for 循环中不必要地分配了内存。您只需将 dummy 例程的地址分配给分配的表条目:

    for (int i = 0; i < size; i++) {
    //  trsfm[i] = (ESfcnTrsfm*) malloc(sizeof(function_ptr)); // Unnecessary!
        trsfm[i] = xpp; // same as trsfm[i] = ...
    }

(同样,您不需要 for 循环来释放 free_function_ptr 函数中的那些指针。)

,

这一行显然是错误的:

auto **trsfm = (ESfcnTrsfm **) malloc(sizeof(function_ptr *));

您需要分配乘以“大小”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。