2013-03-30 1 views
0

기본적으로 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 작업을 수행 할 때 발생하는 것 같습니다.

+0

아마도 디스크에 대한 포인터를 쓰고 다시 읽어 들일 것입니다. 시스템에서는 그 포인터를 좋아하지 않습니다. 구조체에 포인터가 있으면 포인터를 디스크에 쓰고 다시 읽을 수 없습니다. 구조체를 '선형화'하거나 '직렬화'한 다음, 적절한 할당을 수행하면서 입력시이를 delinearize 또는 deserialize해야합니다. 그것은'fread()'와'fwrite()'를 사용하는 것보다 훨씬 어렵습니다. –

답변

1

fread와 fwrite는 원시 포인터를 첫 번째 인수로 사용합니다. 각각의 경우에 전달한 것은 대기열의 주소입니다 (대기열 벡터의 첫 번째 요소 인 hello이고 대기열 벡터의 첫 번째 요소는 here입니다.)

작성한 내용은 실제 큐 클래스 자체, 즉 쓰고 자하는 요소의 큐를 포함하는 클래스. 큐의 구현에 따라, 당신은 무엇이든 쓸 수 있습니다 (또는 아닙니다!). 예를 들어, 큐 클래스가 배열을 가리키는 포인터를 포함하는 경우 요소, 당신은 포인터의 값을 쓰고 있지만 요소 자체를.

을 내가 직렬화 (Is it possible to serialize and deserialize a class in C++?)를 추천 할 것입니다 및 대기열의 당신의 벡터를 역 직렬화된다.

뭐 0
1

memcpy(&here[0], &hello[0], sizeof(queue<unsigned>)*here.size()); 

그래서 당신은 몇 가지 포인터를 포함하는 큐의 내부 표현의 (얕은) 사본을 만들고있다 본질적으로 동일합니다. 대기열의 소멸자는 원본과 복사본 모두 동일한 메모리 영역을 확보하려고합니다. 이로 인해 이중 자유가 생깁니다.

결말은 포인터를 저장하고 정상적으로 작동 할 것으로 예상되는 일반 얕은 memcpy 구조를 수행 할 수 없다는 것입니다.

0

대기열이 연속적으로 메모리에있는 것처럼 복사하고 있지 않습니다. fwrite를 사용하면 요소를 복사해야합니다. 왜냐하면 @reima는 백그라운드에서 사용자가 memcpy을 사용하고 있기 때문입니다.

감사합니다.

관련 문제