기본적으로 fwrite와 fread를 사용하여 이진 파일에 대기열 벡터를 쓰고 읽을 수 있는지 테스트 프로그램을 작성했습니다. 읽기 및 쓰기 부분이 올바르게 수행되고 값이 올바른 경우에도 이중 자유 또는 손상 오류가 발생합니다. 테스트 코드는 다음과 같습니다fread를 C++로 사용할 때 double free 또는 corruption 오류가 발생했습니다.
#include <stdio.h>
#include <vector>
#include <queue>
int main(){
vector<queue<unsigned> > hello(17);
vector<queue<unsigned> > here(17);
queue<unsigned> temp;
for(int f=0;f<4;f++){//initialise a random queue
temp.push(f);
}
for(int i=0;i<hello.size();i++){//assign random queue to every index of vector
hello[i]= temp;
}
FILE *fo;
fo = fopen("hello","wb");
fwrite(&hello[0],sizeof(queue<unsigned>),hello.size(),fo);
fclose(fo);
printf("Writing done!\n");
FILE *fi;
fi=fopen("hello","rb");
fread(&here[0],sizeof(queue<unsigned>),here.size(),fi);
fclose(fi);
printf("Reading done!\n");
for(int i=0;i<here.size();i++){
printf("At key %d value at front is is %d",i,here[i].front());
here[i].pop();
printf(" value %d ",here[i].front());
here[i].pop();
printf(" value %d\n",here[i].front());
}
}
오류는 fread 작업을 수행 할 때 발생하는 것 같습니다.
아마도 디스크에 대한 포인터를 쓰고 다시 읽어 들일 것입니다. 시스템에서는 그 포인터를 좋아하지 않습니다. 구조체에 포인터가 있으면 포인터를 디스크에 쓰고 다시 읽을 수 없습니다. 구조체를 '선형화'하거나 '직렬화'한 다음, 적절한 할당을 수행하면서 입력시이를 delinearize 또는 deserialize해야합니다. 그것은'fread()'와'fwrite()'를 사용하는 것보다 훨씬 어렵습니다. –