簡體   English   中英

在void函數內重新分配

[英]Realloc inside a void function

我在要保持為無效的函數中使用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( ??? );

在函數內部,重新分配看起來像這樣(一些偽代碼):

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”嗎?

簡短答案:

free(*ctl);
free(ctl);

當您調用realloc ,它可能會釋放原先分配的指針(也可能不會釋放)( main中的ctl_data ),這意味着ctl_data可能不再對釋放有效,因此不應釋放(並且您不應嘗試訪問任何內容)最初指向的內存)。 實際上,至少從可見代碼開始,這是相當多余的。 缺少您未顯示的其他用途,擁有以下內容會更干凈:

ctl = malloc( sizeof(uint64_t *) );
*ctl = malloc( *ctl_size * sizeof(uint64_t) );    

再進一步,使用單個指針和單個分配可能更干凈:

uint64_t *ctl_data = malloc(*ctl_size * sizeof(uint64_t));
...
csr_to_csrdu(..., ctl_size, &ctl_data, ...);
...
spmv_csrdu(..., ctl_size, ctl_data, ...);
...
free(ctl_data);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM