如何解决如何分配和释放函数指针数组并保持 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 举报,一经查实,本站将立刻删除。