C 用pthred执行的函数释放堆分配区域会引发分段错误
上述函数传递给pthreads。当程序执行时,我得到一个分段错误。一旦我对调用C 用pthred执行的函数释放堆分配区域会引发分段错误,c,pthreads,C,Pthreads,上述函数传递给pthreads。当程序执行时,我得到一个分段错误。一旦我对调用free(sub)进行注释,我的代码就可以正常工作了。我不明白为什么?我们不能在线程中动态释放内存吗?因为堆在与主线程关联的所有对等线程之间共享 编辑1-完整代码 void *do_chld(void *arg) { char *sub; sub = malloc(255 * sizeof(char)); /* ------ Some Code ---- */
free(sub)
进行注释,我的代码就可以正常工作了。我不明白为什么?我们不能在线程中动态释放内存吗?因为堆在与主线程关联的所有对等线程之间共享
编辑1-完整代码
void *do_chld(void *arg)
{
char *sub;
sub = malloc(255 * sizeof(char));
/*
------ Some Code ----
*/
free(sub);
pthread_exit((void *)0);
}
void*do\u chld(void*arg)
{
int new_fd=(int)arg;
int i,n,val;
char-buf[255];
char*sub;
sub=malloc(255*sizeof(char));
printf(“子线程[%d]:套接字编号=%d\n”,pthread\u self(),new\u fd);
/*从给定的套接字读取*/
n=读取(新的fd,buf,100);
如果(n这听起来像堆损坏-您是否尝试过在没有/*--一些代码--*/
的情况下运行程序
虽然您显示的代码看起来不错,但未显示的代码可能已被覆盖(损坏)堆的一部分位于分配的内存之外。虽然这可能不会在内存损坏时导致故障,也不会在进程终止时导致故障,但您可以很容易地修改描述分配内存的数据结构,从而导致调用free
失败
更新:查看您的第二次代码发布,事实上可能是您无意中修改了sub
指针的值(也称为堆栈损坏)-可能是写入了buf
的末尾。这几乎肯定会导致free
失败
在调用malloc
之后检查sub
的值,然后在调用free
之前再次检查,以确保其未更改
更新2:从头开始-thkala有正确的答案。这听起来像堆损坏-您是否尝试在没有/*--一些代码--*/
的情况下运行程序
虽然您显示的代码看起来不错,但未显示的代码可能已被覆盖(损坏)堆的一部分位于分配的内存之外。虽然这可能不会在内存损坏时导致故障,也不会在进程终止时导致故障,但您可以很容易地修改描述分配内存的数据结构,从而导致调用free
失败
更新:查看您的第二次代码发布,事实上可能是您无意中修改了sub
指针的值(也称为堆栈损坏)-可能是写入了buf
的末尾。这几乎肯定会导致free
失败
在调用malloc
之后检查sub
的值,然后在调用free
之前再次检查,以确保其未更改
更新2:请注意-thkala的答案是否正确。您正在向子指针分配字符串文字——“拼写正确”/“拼写不正确”字符串,然后尝试使用free()
将其释放。字符串文字在代码中静态分配,无法释放
本质上,调用free()
时的sub
指针指向的是未分配给malloc()
的内容
不过,我认为主要的问题是,当您可能想要进行字符串复制时,您需要执行指针赋值,以便字符串的内容位于从malloc()
获得的区域中
编辑:
您可能想看看strcpy()
和strdup()
函数。strcpy()
在您的情况下可以,不过如果您习惯了strncpy()
会更好
strdup()
大致上是strlen()+malloc()+strcpy()
的组合,通常是在堆内存区域中拥有字符串副本时最简单的选项,以便以后可以使用free()
将其释放
编辑2:
在上面的代码中,只对响应消息使用sub
缓冲区,然后释放它。如果这将是代码的最终行为,您只需删除malloc()
和free()
调用,可能就可以了。您正在分配一个字符串文字,即“正确拼写”/“非直接拼写”字符串-指向sub
指针,然后尝试使用free()
将其释放。字符串文本在代码中静态分配,无法释放
本质上,调用free()
时的sub
指针指向的是未分配给malloc()
的内容
不过,我认为主要的问题是,当您可能想要进行字符串复制时,您需要执行指针赋值,以便字符串的内容位于从malloc()
获得的区域中
编辑:
您可能想看看strcpy()
和strdup()
函数。strcpy()
在您的情况下可以,不过如果您习惯了strncpy()
会更好
strdup()
大致上是strlen()+malloc()+strcpy()
的组合,通常是在堆内存区域中拥有字符串副本时最简单的选项,以便以后可以使用free()
将其释放
编辑2:
在上面的代码中,您只对响应消息使用sub
缓冲区,然后释放它。如果这将是您的代码的最终行为,您只需删除malloc()
和free()
调用,可能就可以了。B
void *do_chld(void *arg)
{
int new_fd = (int) arg;
int i,n,val;
char buf[255];
char *sub;
sub = malloc(255 * sizeof(char));
printf("Child thread [%d]: Socket number = %d\n", pthread_self(), new_fd);
/* read from the given socket */
n = read(new_fd,buf,100);
if(n<0){
fprintf(stderr,"Receieving Failed\n");
exit(2);
}
//process
printf("Received %s \n",buf);
val = checkSpelling(buf) ;
if(val){
sub = "Correct Spelling";
}
else{
sub = "InCorrect Spelling";
}
n = 0 ;
n = write(new_fd,sub,strlen(sub));
if(n<0){
fprintf(stderr,"Sending Failed\n");
exit(2);
}
/* close the socket and exit this thread*/
close(new_fd);
free(sub);
pthread_exit((void *)0);
}