2016-11-17 6 views
-2

この問題は疲れました。私もvalgrindを使用しています。しかし私は理由を知らない。私のコードで何が問題なのかを見つけてください。スレッドでmallocを使用してダブルフリーまたは破損(!prev)

#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; 
} 
+0

実際にこの問題について助けが必要な場合は、いくつかの背景情報を提供し、一貫した質問を入力し、コードが達成しようとしていることを教えてください。 – RyanE

答えて

1

あなたが言ったようにfree()にそれらの両方を渡すと、二重解放エラーが発生します

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

としてtdata[j].datadata3[j]を割り当てます。

あなたはdata3[j]にのみコピーポインタとコピー値にしたい場合は、必要とされていない変数tdata[i].dataが、後に上書きされ、メモリリークが発生することになるので、一部

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

を削除します。また、上記のようにダブルフリーエラーが発生するため、部品を取り外してください。

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

+0

ありがとう。私は(i = tcount-1; i> = 0; i - ){ (tdata [i] .data);を削除します。 }今度は、ダブルフリーのエラーはありません。 私の目標は、バブルソートを使用してマルチスレッドで整列するint data [100]です。後でマージソートスレッドのソート済み配列を使用します。 – HERIUN

関連する問題