2013-04-11 86 views
0

我想在C線程工作,我有一些問題,釋放的指針 如果這是線程函數線程空閒指針

void *executor_func(void *param) { 
char *lineEx = (char *) malloc (1024); 

size_t lenEx = 1024; 
ssize_t readEx; 

FILE * fpEx; 
char* pchEx; 

fpEx = fopen(file, "r"); 

if (fpEx == NULL) { 
    printf("ERROR: couldnt open file\n"); 
    exit(0); 
} 

while ((readEx = getline(&lineEx, &lenEx, fpEx)) != -1) { 
    pchEx = strtok(lineEx, " "); 

     //DO MY STUFF WITH THE LINE I RECEIVE FROM FILE 
    } 
free(lineEx); 
fclose(fpEx); 

return NULL; 

} 

想象一下,我執行executor_func的多線程( )... 免費(lineEX)在Valgrind給我提問...爲什麼是這樣?

+0

什麼是你得到具體的錯誤? – 2013-04-11 20:28:19

回答

1

這是從文檔:http://man7.org/linux/man-pages/man3/strtok.3.html

的的strtok()的函數把字符串轉換成標記序列。在 上 首先調用strtok()應該在str中指定要解析的字符串。 在每個應解析相同字符串的後續調用中,str應爲 NULL。

正如strtok手冊所說: 使用這些函數時要小心。如果你使用它們,請注意:

* These functions modify their first argument. 

    * These functions cannot be used on constant strings. 

    * The identity of the delimiting byte is lost. 

    * The strtok() function uses a static buffer while parsing, so it's not 
    thread safe. Use strtok_r() if this matters to you. 

如果你違法的FreeS也許與此有關(from Valgrid manuals):如果你試圖釋放一個指針不指向你也會得到這個消息堆塊的開始.Memcheck使用malloc/new來跟蹤程序分配的塊,以便它可以確切地知道釋放/刪除的參數是否合法。在這裏,這個測試程序已經釋放了同一塊兩次。與非法讀/寫錯誤一樣,Memcheck試圖理解釋放的地址。如果這裏的地址是先前已被釋放的地址,那麼您將被告知 - 使同一塊的重複釋放容易被發現。

而且最後看看這個:strtok function thread safety 你可以嘗試使用strtok_r()

+0

但它只給了我無效的免費錯誤消息,因爲我正在運行同一個executor_func()的多個線程......可能是其中一個線程正在從其他線程中刪除lineEx?那可能嗎 ? 我該如何解決它? – Carlcox89 2013-04-11 22:13:09

+0

如何使用strtok_r當我想要這樣做時: char * pchE = strtok(NULL,「」); ??? – Carlcox89 2013-04-11 23:36:34