C双重释放错误

时间:2014-09-16 19:52:00

标签: c dynamic malloc free realloc

一些先发者:

创建一个名为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 WORK\n");
        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 WORK\n");
        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()函数错了吗?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你应该只免费&#34;阵列&#34;在末尾。你不能免费使用&#34; temp&#34;,因为你将继续使用该块(array = temp不保持某个&#34;引用计数&#34;,但只是指定一个指针)

答案 2 :(得分:0)

调用free后,您不应使用array[size++]取消引用正在执行的已释放内存。

你不应该在那里free(),因为你以后使用的是array

你的最终评论free()将是唯一一个正确的,虽然程序运行正常但没有。

答案 3 :(得分:0)

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

  1. temp == array(temp指向同一个内存)
  2. 数组是免费的,临时指向新内存