2016-05-16 3 views
0

Ich versuche, die Zeiger auf pthread_create NULL übergeben, um herauszufinden, ob und befreit bereits worden sind. Jedoch in dem unten stehenden Code enthält idx noch die Speicheradresse, das heißt, $1 = (int *) 0x601010fest, ob Argument in pthread_create von Haupt-Thread in C NULL ist

Gibt es eine Möglichkeit, wenn idx zu bestimmen, wurde befreit und ist NULL? Denken Sie daran,

#include <pthread.h> 

void *foo(void *i) { 
    int a = *((int *) i); 
    free(i); 
    i = NULL; 
} 

int main() { 
    pthread_t thread; 
    int *idx = malloc(sizeof(*idx)); 
    pthread_create(&thread, 0, foo, (void *) idx); 
    pthread_detach(thread); 
    sleep(10); 
    // if (idx == NULL) // contains (int *) 0x601010 
    // puts("done"); 
    return 0; 
} 
+2

Statt 'pthread_detach', könnten Sie' pthread_join'. Wenn der Join zurückgegeben wird, können Sie sicher sein, dass der Speicher freigegeben ist. – user3386109

+2

'idx' ist eine lokale Variable und Sie übergeben ihren Wert. Es gibt also keine Möglichkeit, dass 'foo' seinen Wert ändern könnte, selbst wenn es gewünscht wäre. Sie initialisieren auch niemals den Speicher, auf den 'idx' zeigt, also hat 'a = * (int *) (i) 'in' foo' ein nicht spezifiziertes Verhalten. – rici

+0

@ user3386109 Danke, werde ich schauen Sie in 'pthread_join', aber ich war neugierig, ob es möglich war, noch pthread_detach verwenden. – user1024718

Antwort

0

als in C, alle Funktionsaufruf Parameter werden von Wert übergeben, so nie, nie, nie ein Zeiger, der free() d null wird gewesen ist, aber wenn Sie es Wert zu machen, kurz nach kostenlosen Anruf.

Wenn Sie das tun

void *p = malloc(100); 
... 
free(p); 

und dann überprüfen Sie den Wert p, wird es das gleiche sein wie vor free(3) Aufruf, denn das einzige, was Sie es NULL zu zwingen, tun können, ist es explizit zuzuweisen, Wert. Wie folgt aus:

free(p); p = NULL; 

Denken Sie daran, dass der einzige Weg in free(3) zum Scheitern verurteilt ist es passiert einen Verweis auf einen nicht zugewiesenen Zeiger, und dies in der Regel hängt das Programm (nicht definiertes Verhalten) Also, wenn Sie den Zeiger sicherstellen wollen, ist nicht verwendbar, weisen Sie ihm einfach NULL zu.