[英]How to free a dynamically allocated memory to an array inside a struct?
我正在嘗試釋放struct _Stack
中已分配數組的內存,但程序不斷崩潰
typedef struct _Stack
{
int top;
unsigned int capacity;
int* arr;
}_Stack;
_Stack* createStack(int capacity)
{
_Stack* stack = (_Stack*) malloc(sizeof(_Stack));
stack->capacity = capacity;
stack->top = -1;
stack->arr = (int*) malloc(sizeof(stack->capacity * sizeof(int)));
return stack;
}
我正在使用此功能釋放內存,但程序崩潰了。
// I have a problem here.
void stack_free(_Stack* stack)
{
free(stack->arr);
free(stack);
}
改變這個:
stack->arr = (int*) malloc(sizeof(stack->capacity * sizeof(int)));
對此:
stack->arr = (int*) malloc(stack->capacity * sizeof(int));
因為您希望數組的大小等於stack->capacity * sizeof(int)
,並且不等於該表達式的大小。
你的程序必須在問題中未顯示的代碼中調用未定義的行為(因為malloc的大小錯誤),這就是為什么它會在以后崩潰的原因。
PS:因為你使用C ++,考慮使用new
而不是(和delete
,而不是free()
)。
在調用malloc時, sizeof(stack->capacity * sizeof(int))
是錯誤的。 它不是數組的大小,而是給出用於表示數組大小的數字的大小。 您可能需要stack->capacity * sizeof(int)
。
另一個可能的問題是在C中你不應該轉換malloc的返回值,因為它可以隱藏其他錯誤並導致崩潰。 請參閱我是否轉換了malloc的結果? 在C ++中你必須這樣做,因為在C ++中進行了更嚴格的類型檢查,但它仍然可以隱藏問題。
這些是我在您顯示的代碼中看到的問題。 但是,請記住,malloc和free中的錯誤不一定是由檢測到它們的實際行引起的。 如果程序的某些部分損壞了malloc系統的內部數據結構,例如緩沖區溢出,那么問題可能會在稍后調用malloc或free,在程序的完全不同的部分中出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.