2017-10-11 81 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())。

相关问题