内部线程自由导致分段错误

Jon*_*hon 2 c pointers pthreads

对此非常困惑.我刚刚开始学习指针,现在决定更深入一些并开始尝试线程.我要做的是将指针传递给一个线程,所以(在mallocing 之后data)我调用:

pthread_create(&ptThread, &ptAttr, newClient, (void *) data);
Run Code Online (Sandbox Code Playgroud)

newClient函数内部,我做我需要做的事情,并且我决定(因为已经分配了一个指针)来释放它:

void *newClient(void *v) {
    // ...stuff happens here...

    free(v);
}
Run Code Online (Sandbox Code Playgroud)

在该free(v);部分,我得到一个分段错误.所以我使用了valgrind,我得到这个说这是一个无效的免费:

==1214== Invalid free() / delete / delete[]
==1214==    at 0x4023B6A: free (vg_replace_malloc.c:366)
==1214==    by 0x804F622: newClient (xxxxxx2.c:44)
==1214==    by 0x4032954: start_thread (pthread_create.c:300)
==1214==    by 0x4112E7D: clone (clone.S:130)
==1214==  Address 0x4 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)

为了增加火力,当我退出我的程序时,valgrind告诉我,我有一个内存泄漏,因为v不是free'd:

==1214== 8 bytes in 2 blocks are definitely lost in loss record 1 of 1
==1214==    at 0x4023F50: malloc (vg_replace_malloc.c:236)
==1214==    by 0x804F453: main (xxxxxx1.c:94)
Run Code Online (Sandbox Code Playgroud)

我的问题 - 如何免费无效?这里有什么我想念的吗?我需要free(v);吗?

cni*_*tar 6

首先,0x4看起来不像一个有效的地址.

==1214==  Address 0x4 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)

我认为发生的事情是你不小心改变了v.这可能是因为粗心memcpy/ strcpy覆盖了堆栈newClient.

在另一方面,一般建议都mallocfree在同一个线程完成.我听说有些分配器可以通过这种方式更高效地完成.