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() 的多个线程... free(lineEX) 在 Valgrind 给我带来了问题... 为什么会这样?

4

1 回答 1

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.

如果您获得非法释放,可能与此有关(来自 Valgrid 手册):如果您尝试释放不指向堆块开头的指针,您也会收到此消息。Memcheck 跟踪分配的块由你的程序使用 malloc/new,所以它可以准确地知道 free/delete 的参数是否合法。在这里,这个测试程序两次释放了同一个块。与非法读/写错误一样,Memcheck 尝试理解释放的地址。如果像这里一样,地址是以前被释放的地址,你会被告知——使同一块的重复释放很容易被发现。

最后看看这个:strtok function thread safety 你可以尝试使用 strtok_r()

于 2013-04-11T20:37:47.563 回答