我试图在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);
}
答案 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)
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,在程序的完全不同的部分中显现。