2017-10-11 83 views
3

我試圖釋放分配陣列的存儲內struct _Stack,但該計劃一直如何釋放一個動態分配的內存到一個struct中的數組?

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); 
} 

Here's the error message

+5

如果你用C++編程,那你爲什麼要用'malloc'和'free'?如果你必須使用指針作爲一個需求,首先使用一個*智能指針* ['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr),你應該使用'new []'和'delete []'而不是'malloc'和'free'。但是,如果指針不是必需的,那麼你應該使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

+1

向我們展示導致此問題並可以運行的完整代碼(MCVE)。另外,不要在名稱中使用下劃線(保留)。 – lorro

+2

我也建議你花些時間閱讀[有關在C++標識符中使用下劃線的規則?](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-下劃線在ac標識符)以下劃線後跟大寫字母(如'_Stack')開頭的符號被保留。 –

回答

2

sizeof(stack->capacity * sizeof(int))在調用malloc的是錯誤的。它不是數組的大小,而是用數字的大小來表示數組的大小。你可能想要stack->capacity * sizeof(int)

另一個可能的問題是,在C,你不應該強制轉換malloc的返回值,因爲它可以隱藏其他錯誤,導致崩潰。請參見Do I cast the result of malloc? 在C++中,您必須這樣做,因爲C++中的類型檢查更嚴格,但它仍然可以隱藏問題。

這些是我看到的代碼中顯示的問題。但是,請記住malloc和free中的錯誤不一定是由檢測到它們的實際行引起的。如果程序的某些部分損壞了malloc系統的內部數據結構,例如緩衝區溢出,則該問題可能會在稍後調用malloc或free時出現在程序的完全不同的部分中。

+0

@Bob__:啊,謝謝。我錯過了。 –

3

更改此:

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())。

相關問題