glibc检测到free()无效指针

7

我在动态内存分配方面遇到了一些问题。

以下是我用来尝试解决问题的测试代码(这是我当前项目代码中的同一个问题,这只是一个更简单的演示方式)。

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

int main(){

    int x = 5;
    int *ptr = (int*) malloc(sizeof(int));
    assert(ptr != NULL);
    ptr = &x;

    printf("x = %d\n",x);

    *ptr = 3;
    printf("x = %d\n",x);

    free(ptr);

    return 0;
}

程序编译正常,运行时打印了正确的输出 "x = 5 x = 3"。但之后出现以下错误:
glibc detected  ./dnam: free(): invalid pointer: 0xbfccf698

dnam是测试程序的名称。 根据我所了解的错误信息,这个错误通常是由于释放你没有使用malloc/calloc/realloc分配的内存所导致的。

这个错误消息后面跟着一个回溯和一个内存映射。在内存映射的末尾,我被告知程序已中止(core dumped)。

3个回答

12
   int *ptr = (int*) malloc(sizeof(int));

   ptr = &x;

你正在改变 ptr 的值!如果你尝试释放它,编译器将报复无限。

这里:

free(ptr);

你正在释放一个不是通过malloc分配的对象。


我是谁?我从一个例子中复制了这段代码,然后调整它以使用malloc和free。 - Lukas
@user2985302 但是 free 将尝试释放 x,而不是由 malloc 分配的对象。你为什么要使用 mallocfree,在这里你不需要它们。 - ouah
那么在这种情况下,我不需要在程序结束时释放指针吗? - Lukas
好的,非常感谢。我错过了有关动态内存分配的讲座,而且幻灯片似乎不足以理解。 - Lukas

1
您正在分配内存并将其地址保存到ptr中。然后,您使ptr指向x的地址,因此当您运行free(ptr)时,您实际上释放了&x,这是不起作用的。
简而言之,当您将指针分配给另一个变量时,不需要使用mallocfree

0
如果你想使用这段代码,我认为你应该使用一个临时指针来保存初始指针。最后释放(temp)。就像这样:
 int *temp = ptr;


  free(temp);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接