簡體   English   中英

釋放malloc結構的數組時出錯

[英]Error while freeing a malloc'd array of structs

我在釋放用於將另一個數組的大小加倍的臨時結構數組時遇到問題。 我似乎沒有任何問題釋放原始數組。

void foo(StruName **structName,i nt *size)
{ 
...
 StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));
 for (i = 0; i < *size; i++)
   temp_array[i] = (*original_array)[i];
 free(*original_array);
 *original_array = temp_array;
 free(*temp_array);

我使用g ++ -Wall得到以下錯誤

error: cannot convert ‘StruName’ to ‘void*’ for argument ‘1’ to ‘void free(void*)’

任何想法可能是什么原因造成的? 如果我離開自由(* temp_array); 總共,程序可以編譯並運行良好。 免費(temp_array); 導致段錯誤

函數定義的以下部分不正確:

void foo(Struct **structName, int count, int *size)

您是否已將結構聲明為structName 如果是的話,您還需要在定義中同時提及參數,而不僅僅是其類型。即使structName是您的結構,那么您也應該編寫struct structName**而不是Struct **structName 。( Struct不是與C中的struct相同)

這是另一個錯誤:

malloc(*size * 2 * sizeof(original_array)

您應該將*size括在括號中,因為尚不清楚是要取消引用size還是要取消引用size*2*sizeof(original_array)

original_array是指向指針的原因是什么?

無論如何,在我看來,您不應該釋放temp數組,因為您的代碼段似乎暗示您正在用它替換*original_array 如果是這種情況,則說明您正在使用釋放的內存。 這可能會運行一會兒,但是最終您可能會發現數組值被覆蓋,因為釋放的內存被重新分配給其他對象。

// here *original_array will be pointing to the new `malloc`ed memory
*original_array = temp_array;

// After this line, *original_array is left dangling to the recently freed memory

free(*temp_array);

我將刪除最后一條空閑線。

*編輯*我之前提到過,內存將被釋放兩次,事實並非如此,因為應該在不取消引用* temp_array的情況下調用free以便使內存為真。

釋放所分配的內容是內存使用的基本原理。 如果釋放未分配的內容,則可能會導致segmentfault。

代碼已使用以下方式分配了內存:

    StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName));

然后,它應該使用以下方法釋放內存:

    free(*temp_array);

確保兩個參數的內容正確。

暫無
暫無

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

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