簡體   English   中英

如何將動態分配的內存釋放到struct中的數組?

[英]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.

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