【问题标题】:Free() function causes program to crashFree() 函数导致程序崩溃
【发布时间】:2016-03-21 15:31:57
【问题描述】:

我目前正在尝试释放分配的内存,但是这样做会导致程序崩溃。我是 C 和一般编程的新手,如果能在问题和任何其他可能源于我的经验不足的问题上获得帮助,我会很高兴。

Pool* allocatePool(int x);
void freePool(Pool* pool);
void store(Pool* pool, int offset, int size, void *object);

typedef struct _POOL
{
    int size;
    void* memory;
} Pool;

int main()
{
    printf("enter the number of bytes you want to allocate//>\n");
    int x;
    Pool* p;
    scanf("%d", &x);
    p=allocatePool(x);
    freePool(p);
    return 0;
}

/* Allocate a memory pool of size n bytes from system memory (i.e., via malloc()) and return a pointer to the filled data Pool structure */

Pool* allocatePool(int x)
{
    static Pool p;
    p.size = x;

    p.memory = malloc(x);
    printf("%p\n", &p);

    return &p;//return the address of the Pool
}

/* Free a memory pool allocated through allocatePool(int) */
void freePool(Pool* pool) 
{
    free(pool);
    printf("%p\n", &pool);
}

【问题讨论】:

  • 您必须free 与您分配的内存相同。你mallocp.memory,但是你free(&p),这根本不是分配在堆上的内存,而是静态对象的地址。
  • 永远不会是free() 函数导致程序崩溃。这是您的代码中的一个错误导致程序崩溃。
  • @SergeyA Never 有点强。这有点像说你永远不会被闪电击中。当然这不太可能,但并不是说没有 malloc/free somewhere 的任何错误实现。
  • @Cubic, -fpedantic :)
  • 关于这种错误:这里使用系统的工具来帮助你。 Microsoft 的调试模式下的 Visual Studio 会以相当丰富的信息使您的程序崩溃。在 Linux 中使用“valgrind”运行您的程序,这将报告错误的 free() 调用。

标签: c


【解决方案1】:

您必须释放已分配的相同内存。这里:

p.memory = malloc(x);

您将x 字节分配给p.memory。这意味着这里:

free(pool);
printf("%p\n", &pool);

您应该释放相同的内存。您尝试使用free 池对象,但它没有在堆上分配。在您的实现中,它是一个包含单个池的静态对象。尝试free 未在堆上分配的内存是未定义的行为,在您的情况下是崩溃。

上面的代码还显示了对free 的另一个误解:它不会更改分配内存的句柄。它仅将先前分配的字节标记为再次可用。您的程序必须防止通过您拥有其内存的指针freed 访问内存。

另外,&pool不是池对象的地址,而是局部指针变量pool的地址。

要修复您的崩溃,请将您的函数更改为:

void freePool(Pool *pool) 
{
    if (pool) free(pool->memory);
}

【讨论】:

  • 仍然无法解决问题,因为 main 中的 p 现在指向不再有效的内存。
  • 错误的@FredK,他将 static 池的地址返回给主池并将其传递给 freePool...这里没有任何问题。
  • 啊 - 错过了“静态”声明。仍然不是一个好的设计;如果他在没有首先释放 p,memory 的情况下第二次调用 allocatePool() 将会发生内存泄漏。
  • @FredK:是的,设计很差; allocatePool 建议您可以获得许多池。 OP对指针和分配的把握还不是很好,所以这里首先要解决这个问题。
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2015-06-28
相关资源
最近更新 更多