1

下面我有一个功能trim()。从整数数组中删除前导零。它返回一个指针,它从malloc(). trim()在运行对and的连续调用循环时free()。我注意到trim()- 接收到的返回值malloc()在每次迭代中都是相同的。

我的理解是两次释放同一个指针,如果不是NULL,将导致双重释放错误。为什么在这种情况下没有遇到双重释放错误?

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

int main()
{
    int i, j, length;
    int n[] = { 4, 5, 6 };
    int m[] = { 0, 3, 5 };
    int *num;
    int *trimmed, *trimmed_length;

    trimmed_length = &length;

    for (i = 0; i < 10; i++)
    {
        num = (i % 2 == 0) ? n : m;

        trimmed = trim(num, 3, trimmed_length);

        if (!trimmed)
        {
            printf("trimmed was null\n");
            exit(-1);
        }

        for (j = 0; j < *trimmed_length; j++)
        {
            printf("%d", trimmed[j]);
        }   

        printf("\n");

        free(trimmed); 
    }

    exit(0);
}

int *trim(int *n, int nlength, int *res_length)
{
    int i, j;
    int *res;

    for (i = 0; i < nlength; i++)
    {
        if (n[i] > 0)
        {
            break;
        }
    }

    *res_length = (nlength - i);

    res = malloc(sizeof(int) * (*res_length));

    if (!res)
    {
        return NULL;
    }

    j = 0;

    while (i < nlength)
    {
        res[j++] = n[i++];
    }

    printf("Returned pointer from trim() %d\n", res);

    return res;
}

输出:

Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
Returned pointer from trim() 11759632
456
Returned pointer from trim() 11759632
35
4

2 回答 2

2

你所看到的不是双重免费的。考虑:

void *p1, *p2;

p1 = malloc(10);
free(p1);
p2 = malloc(10);

此时不能保证 p1 和 p2 相同。不能保证它们是不同的。如果它们碰巧是相同的,那么free(p2)此时调用不是双重释放。以下将是实际的双重免费:

void *p = malloc(10);
free(p);
free(p);
于 2015-11-26T18:33:46.833 回答
1

据我所知,您的情况没有double free()

首先,您使用 分配内存malloc(),然后使用free()它。在一个内存块被 free-d 后,可以使用 next 调用重新分配它(即,可以返回相同的指针)malloc()。释放它也是完全合法的(也是必需的)。

如果我们仔细查看C11规范,第 7.22.3.3 章,它说(强调我的

free函数使 所指向的空间ptr被释放,也就是说,可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。

所以,

  1. 释放后,可以重新分配内存空间(指向 ya 指针)。
  2. 除非指针刚刚通过调用释放,否则调用函数返回的指针和函数族free()是完全合法的。free()malloc()
于 2015-11-26T18:34:16.310 回答