【发布时间】:2023-03-21 18:45:01
【问题描述】:
在我想保留为无效的函数中使用 realloc 时,我遇到了内存泄漏问题。我正在构建的代码用于将稀疏矩阵数据类型从“CSR”转换为称为“CSR-DU”的增量单位格式。
包含 realloc 的违规函数的头文件:
void csr_to_csrdu(..., int *ctl_size, uint64_t **ctl, ...);
ctl 是一个双指针,指向数组数据,当数组通过 realloc 填满时,数组数据将被修改和重塑。数组是动态大小的,在执行之前无法猜测最终大小。因此需要一个数组大小的指针和一个双指针来保存 main() 中数据数组的内存地址。
在 main() 中:
ctl = (uint64_t **) malloc( sizeof(uint64_t *) );
ctl_data = (uint64_t *) malloc( *ctl_size * sizeof(uint64_t) );
*ctl= ctl_data; // point to memory data
// call data type conversion
csr_to_csrdu(..., ctl_size, ctl, ...);
// compute sparse matrix-vector multiplication w/ ctl
spmv_csrdu(..., ctl_size, *ctl, ...);
// free ctl data - my problem!
free( ??? );
在函数内部,realloc 看起来像这样(一些伪代码):
if( ctl_index >= *ctl_size )
{
int estimate = get_estimate();
tempPtr = realloc(*ctl, (*ctl_size + estimate)*sizeof(uint64_t) );
if( tempPtr == NULL ){
print_fatal_error();
exit();
}else{
*ctl = tempPtr;
}
}
但是,在函数内部发生重新分配后,我似乎无法弄清楚如何释放“ctl_data”。我最初在 main() 中的地址已被销毁。我尝试过的事情都无济于事:
// both cause "double free or corruption" crash
free( ctl_data );
free( *ctl );
我不确定如何在此处继续。有什么办法可以让我安全地释放在函数内部创建的“tempPtr”?
【问题讨论】:
-
在 C 语言中,您不会强制转换
malloc- 请查看此内容 -
您所展示的是一个代码难题。请合并发minimal reproducible example。
-
ctl_data 继续存在,新的 ctl[0] 指向它。
-
我想说,不要同时释放
*ctl和ctl_data,但要同时释放*ctl和ctl(按此顺序)。 -
看到将
realloc的结果保存到与传递的保存原始内存地址的变量不同的变量中的代码令人心旷神怡。
标签: c