struct corrupt heap的可用内存

时间:2016-11-28 20:57:08

标签: c memory-leaks

我正在尝试在C中实现“我的”安全数组版本,当我尝试释放我创建的结构时,我遇到了内存泄漏问题,我无法弄清楚问题。

#include <stdio.h>
#include <stdlib.h>

typedef struct safe_array safe_array;
struct safe_array
{
    size_t size;
    int * safe_array;
};

void init_array(safe_array* safe_array, size_t size, int initial_value)
{
    safe_array->safe_array = malloc(sizeof(int) * size);
    for (size_t i = 0; i < size; i++)
    {
        safe_array->safe_array[i] = initial_value;
    }
    safe_array->size = size;
}

void free_array(safe_array* safe_array)
{
    free(safe_array->safe_array);
    free(safe_array);
}

int* access_array_element(safe_array* safe_array, size_t index)
{
    int out_of_range = 0;
    if (index >= safe_array->size)
    {
        return 0;
    }

    return &safe_array->safe_array[index];
}

int main()
{

    /*Create a safe_array and print its elements*/
    safe_array my_safe;
    init_array(&my_safe, 5, 2);
    for (size_t i = 0; i < my_safe.size; i++)
    {
        printf("Element %d is %d", i, *access_array_element(&my_safe, i));
    }

    /*Free the safe_array*/
    free_array(&my_safe);

    return 0;
}

当我尝试free(safe_array)时出现问题,但我不知道发生了什么。我不能释放它,因为我从来没有为它分配内存,如果是这样的话,我怎么能完全释放那个结构?

我收到的确切消息是Debug Assertion Failed,其中包含指向debug_heap.cpp文件的链接。

我需要确切地说,我希望能够释放整个结构而不仅仅是其内容。

2 个答案:

答案 0 :(得分:2)

问题是&my_safe是指向堆栈上分配的结构的指针(通过将其声明为局部变量),而不是堆上分配的 (使用malloc)。因此,您无法在其上调用free

由于init_array要求客户端代码已经分配了结构,free_array同样需要客户端代码来处理以后解除分配结构。正如init_array仅为数组内容分配内存一样,free_array应该只为内存释放内存:

void free_array(safe_array* safe_array)
{
    free(safe_array->safe_array);
}

答案 1 :(得分:2)

这是正确的。您可以free使用malloc分配的内容(或间接分配给strdup)。您不能free未使用malloc分配的内容,而my_safe不是使用malloc分配的内容。