C双重释放错误



一些启动器:

创建一个称为fractions的数据结构的动态数组。Fractions具有设置、打印、打印等功能。

我不断地得到一个双重释放或损坏的错误,以及内存映射中的许多胡言乱语。这是来自输出的错误:

双自由或损坏(顶部):0x0000000001976010*

我知道它被释放/删除了两次,但这是产生错误的代码:

#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
    long long int size = 0;
    long long int capacity = 10;
    int FSize = sizeof(struct fraction);
    struct fraction* array = NULL;
    struct fraction in;
    array = (struct fraction*)malloc(FSize * capacity);
    if (array == NULL) {
        printf("MALLOC DID NOT WORKn");
        exit(1);
    }
    int i = 0;
    for (i = 0; i < 17; i++) {
        if (size == capacity) {
            capacity = capacity * 2;
            struct fraction* temp = NULL;
            temp = (struct fraction*)realloc(array, FSize * capacity);
            //  free(array);
            array = temp;
            free(temp);
        }
        SetFrac(&in);
        array[size++] = in;
    }
    printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> n");
    getchar();
    for (i = 0; i < size; i++) {
        struct fraction t = array[i];
        PrintFrac(&t);
    }
    free(array);
    return 0;
}

这是的工作代码

#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
    long long int size = 0;
    long long int capacity = 10;
    int FSize = sizeof(struct fraction);
    struct fraction* array = NULL;
    struct fraction in;
    array = (struct fraction*)malloc(FSize * capacity);
    if (array == NULL) {
        printf("MALLOC DID NOT WORKn");
        exit(1);
    }
    int i = 0;
    for (i = 0; i < 17; i++) {
        if (size == capacity) {
            capacity = capacity * 2;
            struct fraction* temp = NULL;
            temp = (struct fraction*)realloc(array, FSize * capacity);
            //  free(array);
            array = temp;
            free(temp);
        }
        SetFrac(&in);
        array[size++] = in;
    }
    printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> n");
    getchar();
    for (i = 0; i < size; i++) {
        struct fraction t = array[i];
        PrintFrac(&t);
    }
    //    free(array);
    return 0;
}

我是不是用错了free()函数?

数组和temp具有相同的指针地址,因此当您释放temp时,数组也将被释放

您应该只在末尾释放"array"。您不能释放"temp",因为您将继续使用块(array = temp不维护特定的"引用计数",而只是分配一个指针)。

调用free后,不应该取消引用释放的内存,这是通过使用array[size++]来完成的。

您不应该在那里的临时free(),因为您稍后将使用array

您最后注释掉的free()将是唯一正确的,尽管程序应该在没有它的情况下运行良好。

您不需要在realloc-temp之后释放(temp),只需要释放(数组)main的末尾。如果你realloc是成功的,有两种可能性:

  1. temp==数组(指向同一内存的temp)
  2. 数组是空闲的,临时指向新内存

相关内容

  • 没有找到相关文章