如何分配和释放函数指针数组并让 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
函数中的那些指针。)
如何在 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
函数中的那些指针。)