2016-03-21 10 views
1

ich derzeit zugewiesenen Speicher zu versuchen, aber durch so tut es das Programm zum Absturz verursacht. Ich bin neu in C und Programmierung im Allgemeinen, und wäre großartig, um Hilfe mit dem Problem und allen weiteren Problemen zu erhalten, die aus meiner Unerfahrenheit stammen können.Free() Funktion verursacht Programm zum Absturz bringt

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

Sie müssen 'fREe' den gleichen Speicher, die Sie zugeordnet haben. You 'malloc' zu' p.memory', aber Sie 'frei (& p)', die keinen Speicher o den Haufen überhaupt, aber die Adresse eines statischen Objekts alocated ist. –

+0

Es ist nie 'free()' Funktion, die das Programm zum Absturz bringt. Es ist ein Fehler in Ihrem Code, der das Programm zum Absturz bringt. – SergeyA

+0

@SergeyA _Never_ ist ein bisschen stark. Es ist ein bisschen so, als würde man sagen, dass man nie vom Blitz getroffen wird. Sicher, es ist nicht sehr wahrscheinlich, aber es ist nicht so, als gäbe es keine Buggy-Implementierungen von malloc/free _somewhere_. – Cubic

Antwort

3

Sie müssen denselben Speicher freigeben, den Sie zugewiesen haben. hier:

p.memory = malloc(x); 

Sie zuteilen x Bytes p.memory. Das heißt, hier:

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

sollten Sie den gleichen Speicher freigeben. Sie versuchen, das Pool-Objekt stattdessen free, aber das ist nicht auf dem Heap zugeordnet. In Ihrer Implementierung ist es ein statisches Objekt, das den einzelnen Pool enthält. Versuchen, free Speicher, der nicht auf dem Heap zugeordnet wurde, ist undefiniertes Verhalten, in Ihrem Fall ein Absturz.

Der obige Code zeigt auch ein weiteres Missverständnis über free: Es ist nicht der Griff an den zugewiesenen Speicher nicht ändert. Es markiert nur die zuvor zugewiesenen Bytes als wieder verwendbar. Ihr Programm muss sich gegen den Zugriff auf den Speicher durch den Zeiger schützen, dessen Speicher Sie haben free d.

Außerdem ist &pool nicht die Adresse des Pool-Objekts, sondern die Adresse der lokalen Zeigervariablen pool.

den Absturz zu beheben, um Ihre Funktion ändern:

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

Immer noch wird das Problem nicht lösen, weil p in main jetzt auf Speicher verweist, der nicht mehr gültig ist. – FredK

+0

Wrong @FredK, kehrt er Adresse ** ** statisch Pool an die Haupt- und übergeben es an Freepool ... Nichts ist hier falsch. –

+0

Ah - verpasste die "statische" Deklaration. Immer noch kein gutes Design; Es wird einen Speicherverlust geben, wenn er allocatePool() ein zweites Mal aufruft, ohne zuerst p, Speicher freizugeben. – FredK

Verwandte Themen