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

时间:2011-08-06 15:48:37

标签: c pointers pthreads

对此非常困惑。我刚刚开始学习指针,现在决定更深入一些并开始尝试线程。我要做的是将指针传递给一个线程,所以(在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);吗?

2 个答案:

答案 0 :(得分:6)

首先,0x4看起来不像是有效地址。

==1214==  Address 0x4 is not stack'd, malloc'd or (recently) free'd

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

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

答案 1 :(得分:0)

问题可能就在于malloc data 0x4。它绕过了错误(malloc似乎不合理),所以可能你已经遇到了问题。一个常见错误是忘记包含头文件,并将int解释为按默认规则返回malloc

Casting几乎总是隐藏编程,或者更糟糕的是设计错误:

  • 不要转换malloc的返回值。 void*返回void* 这与任何其他数据类型指针兼容
  • 不要像调用pthread_create那样投射指向void*的指针。所有数据类型指针都会毫无问题地转换为{{1}}