gpt4 book ai didi

c - c 中的双重释放或损坏 (!prev),使用线程、malloc

转载 作者:行者123 更新时间:2023-11-30 20:22:08 25 4
gpt4 key购买 nike

我厌倦了这个问题。我也用valgrind。但我不知道为什么。请找出我的代码中有什么问题。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

static pthread_t *tid=NULL;
static int **data3=NULL;
typedef struct _Thdata
{
int *data;
int size;
int nthread;
} Thdata;

Thdata *tdata=NULL;

void *bubble(void *d){

Thdata *arr =(Thdata *)d;

int i,j,tmp;
int n=arr->size;
printf("thread #=%d n=%d\n",arr->nthread,n);


for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if((arr->data[j])>(arr->data[j+1]))
{
tmp = (arr->data[j]);
(arr->data[j])=(arr->data[j+1]);
(arr->data[j+1])=tmp;
}
}
}

for(j=0;j<n;j++)
printf("%d ",(arr->data[j]));
printf("\n");

pthread_exit((void *)1);
}



int main(int argc, char **argv){

FILE * fd;
int i,j;
int data[100];
int tcount = atoi(argv[1]);
int n = 100/tcount;
int err;
void *b;
//dynamic data
tid = (pthread_t *)malloc(tcount* sizeof(pthread_t));
data3 = (int **)malloc(tcount *sizeof(int*));
for( i=0; i<tcount; i++)
data3[i] = (int *)malloc((100/tcount) *sizeof(int));

tdata = (Thdata *)malloc(tcount*sizeof(Thdata));
for(i=0;i<tcount; i++) {
tdata[i].data =(int *)malloc(n*sizeof(int));
}
//dynamic data end

fd = fopen("data.txt", "r");
printf("tcount = %d n=%d\n",tcount,n);

// origin data
for(i =0; i<100;i++)
{
fscanf(fd, "%d",&data[i]);
printf("%d ", data[i]);
}
printf("\n");





for(j=0;j<tcount;j++){
for(i=0;i<n;i++){
data3[j][i]=data[n*j+i];
printf("%d ",data3[j][i]);
//tdata[j].data[i]=data[j][i];
}
printf("\n");
tdata[j].data=data3[j];
tdata[j].size=n;
tdata[j].nthread=0;
}


for(j=0;j<tcount;j++){
for(i=0;i<n;i++){
printf("%d ",tdata[j].data[i]);
}
printf("tdata[%d].size = %d",j,tdata[j].size);
printf("\n");
}

for(i =0; i<tcount;i++)
{
err=pthread_create(&tid[i],NULL,bubble,(void *)&tdata[i]);
if(err != 0)
printf("creat thread error");
tdata[i].nthread=i;
}

for(i=0;i<tcount;i++)
pthread_join(tid[i],&b);


for(i=tcount-1;i>=0;i--){
free(tdata[i].data);
}
free(tdata);
for(int i=tcount-1; i>=0; i--)
free(data3[i]);
free(data3);
free(tid);
fclose(fd);
return 0;
}

最佳答案

您将 data3[j] 分配给 tdata[j].data 作为

tdata[j].data=data3[j];

因此将它们都传递给 free() 将导致双重释放错误,正如您所说。

如果您只想复制指针并且不需要复制 data3[j] 中的值,请删除该部分

for(i=0;i<tcount; i++) {
tdata[i].data =(int *)malloc(n*sizeof(int));
}

因为变量tdata[i].data稍后会被覆盖,导致内存泄漏。同时删除该部分

for(i=tcount-1;i>=0;i--){
free(tdata[i].data);
}

因为它会导致如上所述的双重释放错误。

关于c - c 中的双重释放或损坏 (!prev),使用线程、malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40657175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com