如何分配和释放函数指针数组并让 valgrind 满意?

How to allocate and deallocate an array of function pointers and keep valgrind happy?

如何在 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;
}

这一行明显错误:

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

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

您的 make_function_ptr 函数为 只有一个 function_ptr 在 'outer' table 中分配 space,而不是而不是为 size 指针分配 space。所以,这个:

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

应该是:

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

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

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

    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 函数中的那些指针。)