【问题标题】:How to free a dynamically allocated memory to an array inside a struct?如何将动态分配的内存释放到结构内的数组?
【发布时间】:2017-10-11 06:14:13
【问题描述】:

我正在尝试释放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);
}

【问题讨论】:

标签: c++ arrays struct malloc free


【解决方案1】:

改变这个:

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

【讨论】:

    【解决方案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 时表现出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2020-04-18
      • 2011-03-17
      • 2016-07-16
      相关资源
      最近更新 更多