2016-03-21 2 views
1

現在割り当てられているメモリを解放しようとしていますが、そうするとプログラムがクラッシュします。私はCやプログラミング全般を初めて熟知しており、経験の浅さから生じる可能性がある問題やその他の問題の助けを受けることができます。Free()関数がプログラムをクラッシュさせます

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'必要があります。あなたは 'p.memory'に' malloc'を入れますが、ヒープにはメモリは割り当てられていませんが、静的オブジェクトのアドレスは 'free(&p)'です。 –

+0

これはプログラムをクラッシュさせる 'free()'関数ではありません。あなたのコードのバグで、プログラムがクラッシュします。 – SergeyA

+0

@ SergeyA _Never_は少し強いです。あなたが雷に襲われることは決してないと言っているようなものです。確かにそれほど有望ではありませんが、malloc/free _どこかにバグのある実装はありません。 – Cubic

答えて

3

割り当てたのと同じメモリを解放する必要があります。ここに:

p.memory = malloc(x); 

あなたはp.memoryxバイトを割り当てます。つまり、次のことを意味します。

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 **プールのアドレスをメインに返し、それをfreePoolに渡します...何も間違っていません。 –

+0

Ah - 「静的」宣言がありませんでした。まだ良いデザインではありません。最初にメモリを解放せずにallocatePool()を2回呼び出すと、メモリリークが発生します。 – FredK

関連する問題