c - 为什么免费(): invalid next size (fast)

标签 c memory struct g++ free

请查看 C 代码并帮助我。为什么我有“free():无效的下一个尺寸(快速)”?我尝试 valgrind,但不明白,有太多“无效的写入/读取......”,但如果我评论 free_array(all) 有正确的答案。它只是所有代码的一部分。

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

struct pair {
    uint32_t num;
    uint32_t effect;
};

struct array {
    size_t size;
    struct pair data[];
};

size_t sizeof_array(size_t size)
{
    return sizeof(struct array) + (size * sizeof(uint32_t));
}

struct pair *create_pair(uint32_t i, uint32_t eff)
{
    struct pair *ret = calloc(2, sizeof(uint32_t));
    if (! ret)
        abort();
    ret->num = i;
    ret->effect = eff;
    return ret;
}

struct array *create_array(size_t size)
{
    struct array *ret = calloc(1, sizeof_array(size));
    if (! ret) 
        abort();
    ret->size = size;
    return ret;
}

void free_array(struct array *array)
{
//    size_t i;
//    for (i = 0; i < array->size; ++i) {
//        free(&array->data[i]);
//    }
    free(array);
}

int main()
    {
    int eff;
    size_t n;
    scanf("%zu", &n);
    struct array *all = create_array(n);
    size_t i;
    for(i = 0; i < n; ++i) {
        scanf("%d", &eff);
        all->data[i] = *create_pair(i, eff);
    }

    free_array(all);
    return 0;
}

最佳答案

就像我在评论中所说的那样,在分配内存时不要使用结构体每个成员的大小作为基础,而应使用实际的结构体。这是导致问题的原因,因为您的函数 sizeof_array 返回的大小大约是您所需大小的一半。

相反,它应该看起来像

size_t sizeof_array(size_t size)
{
    return sizeof(struct array) + (size * sizeof(struct pair));
    /* Notice the use of the structure instead   ^^^^^^^^^^^ */
}

因为 sizeof_array 返回的大小太小,所以您分配的内存太少并且写入超出了分配的内存范围,然后最终导致未定义的行为。 p> <小时/>

当您为数组中的每个结构对分配内存时,还会出现内存泄漏。当您分配 array 结构时,您已经为每个 pair 分配了内存,无需逐一分配,特别是因为您只需丢弃指针并因此拥有内存泄漏。

释放时,只需释放 array 结构,因为这就是您(应该)分配的全部内容。

关于c - 为什么免费(): invalid next size (fast),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19470315/

相关文章:

c - system() 调用 o/p 到从命令行传递的文件名

c++ - 是否可以让指针指向第一个指针指向的变量?

类及其派生类的 C++ 内存池

c++ - 什么会导致隐式/默认复制构造函数在 POD 结构上失败?

c - 返回指针时,什么时候数据需要是静态的?

c - 如何通过libevent创建tcp客户端

c - 如何分配内存、赋值并将其返回给调用函数?

Java套接字客户端无法接收来自C服务器的响应

大文件上的c++疯狂内存消耗

c++ - 我的结构数组打印出垃圾