2016-03-21 176 views
1

我目前正试图释放分配的内存,但这样做会导致程序崩溃。我对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); 
} 
+4

您必须'free'您已经分配了相同的内存。你把'malloc'改为'p.memory',但是你释放了(&p)',它根本不是内存分配的堆,而是一个静态对象的地址。 –

+0

它永远不会是导致程序崩溃的'free()'函数。它是导致程序崩溃的代码中的一个错误。 – SergeyA

+0

@SergeyA_Never_有点强。这有点像说你永远不会被闪电击中。确定它不太可能,但它不像malloc/free _somewhere_有任何错误的实现。 – Cubic

回答

3

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

p.memory = malloc(x); 

你分配x字节p.memory。这意味着这里:

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

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

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

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

要解决你的崩溃,改变你的函数:

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

仍然不会解决问题,因为main中的p现在指向不再有效的内存。 – FredK

+0

@FredK错误,他将** static ** Pool的地址返回给main,并将它传递给freePool ...这里没有错。 –

+0

啊 - 错过了“静态”声明。仍然不是一个好的设计;如果第一次调用allocatePool()而没有首先释放p,内存,将会出现内存泄漏。 – FredK