Jon*_*hon 2 c pointers pthreads
对此非常困惑.我刚刚开始学习指针,现在决定更深入一些并开始尝试线程.我要做的是将指针传递给一个线程,所以(在malloc
ing 之后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);
吗?
首先,0x4
看起来不像一个有效的地址.
==1214== Address 0x4 is not stack'd, malloc'd or (recently) free'd
Run Code Online (Sandbox Code Playgroud)
我认为发生的事情是你不小心改变了v
.这可能是因为粗心memcpy
/ strcpy
覆盖了堆栈newClient
.
在另一方面,一般建议都malloc
与free
在同一个线程完成.我听说有些分配器可以通过这种方式更高效地完成.