我正在尝试使用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给我带来了问题...为什么呢?

最佳答案

这来自文档:http://man7.org/linux/man-pages/man3/strtok.3.html


  strtok()函数将字符串解析为令牌序列。上
  的
         首次调用strtok()时应在str中指定要解析的字符串。
         在每个后续的应解析相同字符串的调用中,str应该为
         空值。


正如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.


如果您获得了非法的释放,则可能与此(from Valgrid manuals)有关:如果您尝试释放未指向堆块开始的指针,则也会收到此消息.Memcheck会跟踪分配的块由您的程序使用malloc / new来完成,因此它可以准确地知道free / delete的参数是否合法。在这里,此测试程序已释放相同的块两次。与非法的读/写错误一样,Memcheck尝试使释放的地址有意义。如果像这里一样,该地址是先前已释放的地址,则将被告知-使同一块的重复释放变得容易发现。

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

关于c - 无线程指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15958206/

10-15 11:24