对此非常困惑。我刚刚开始学习指针,现在决定更深入一些并开始尝试线程。我要做的是将指针传递给一个线程,所以(在malloc
data
之后)我打电话:
pthread_create(&ptThread, &ptAttr, newClient, (void *) data);
在newClient
函数中,我做我需要做的事情,并且我决定(因为已经分配了一个指针)来释放它:
void *newClient(void *v) {
// ...stuff happens here...
free(v);
}
在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
为了解决这个问题,当我退出我的程序时,valgrind告诉我,因为v
不是free
而导致内存泄漏:
==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)
我的问题 - 如何免费无效?这里有什么我想念的吗?我需要free(v);
吗?
答案 0 :(得分:6)
首先,0x4
看起来不像是有效地址。
==1214== Address 0x4 is not stack'd, malloc'd or (recently) free'd
我认为发生的事情是你不小心改变了v
。这可能是因为粗略的memcpy
/ strcpy
覆盖了newClient
的堆栈。
另一方面,通常建议malloc
和free
都在同一个线程中完成。我听说有些分配器可以通过这种方式更高效地完成它。
答案 1 :(得分:0)
问题可能就在于malloc
data
0x4
。它绕过了错误(malloc
似乎不合理),所以可能你已经遇到了问题。一个常见错误是忘记包含头文件,并将int
解释为按默认规则返回malloc
。
Casting几乎总是隐藏编程,或者更糟糕的是设计错误:
malloc
的返回值。 void*
返回void*
这与任何其他数据类型指针兼容pthread_create
那样投射指向void*
的指针。所有数据类型指针都会毫无问题地转换为{{1}}