如何将动态分配的内存释放到struct中的数组?

时间:2017-10-11 06:14:13

标签: c++ arrays struct malloc free

我试图在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);
}

Here's the error message

2 个答案:

答案 0 :(得分: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())。

答案 1 :(得分:2)

你对malloc的调用中的

sizeof(stack->capacity * sizeof(int))是错误的。它不是数组的大小,而是给出用于表示数组大小的数字的大小。您可能需要stack->capacity * sizeof(int)

另一个可能的问题是,在C中你不应该转换malloc的返回值,因为它可以隐藏其他错误并导致崩溃。见Do I cast the result of malloc? 在C ++中你必须这样做,因为在C ++中进行更严格的类型检查,但它仍然可以隐藏问题。

这些是我看到的代码所显示的问题。但是,请记住,malloc和free中的错误不一定是由检测到它们的实际行引起的。如果你的程序的某些部分损坏了malloc系统的内部数据结构,例如缓冲区溢出,那么问题可以在稍后调用malloc或free,在程序的完全不同的部分中显现。