0

つまり、基本的には、fwrite と fread をそれぞれ使用して、キューのベクトルをバイナリ ファイルに読み書きできるかどうかを確認するテスト プログラムを作成していました。読み取りと書き込みの部分が正しく行われ、値が正しい場合でも、二重解放または破損エラーが発生します。テストコードは以下

#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操作を行っているときにエラーが発生したようです。

4

3 に答える 3

1

あなたがしていることは本質的に同等です

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

したがって、いくつかのポインターを含むキューの内部表現の (浅い) コピーを作成しています。キューのデストラクタでは、オリジナルとコピーの両方が同じメモリ領域を解放しようとします。これにより、ダブルフリーが発生します。

memcpy肝心なのは、ポインタを格納し、それが機能することを期待する単純な浅い構造を行うことはできないということです。

于 2013-03-30T12:15:31.247 に答える
1

fread と fwrite は、最初の引数として生のポインターを取ります。いずれの場合も、渡したのはキューのアドレスです ( という名前のキューのベクトルhelloの最初の要素と、 という名前のキューのベクトルの最初の要素ですhere

あなたが書いているのは、実際のキュー クラスそのものです。つまり、書きたい要素のキューを含むクラスです。キューの実装に応じて、何でも書き込めます (または書き込めません!)。たとえば、キュ​​ー クラスに要素の配列を指すポインターが含まれている場合、要素自体ではなく、ポインターの値を書き込んでいます。

シリアライズ ( Is it possible to serialize and desserialize a class in C++? ) およびキューのベクトルをデシリアライズすることをお勧めします。

于 2013-03-30T12:10:08.403 に答える
0

あたかもメモリ内で連続しているかのようにキューをコピーしていますが、そうではありません。@reimaが言ったように、バックグラウンドでmemcpyを使用しているため、 fwrite を使用して要素ごとにコピーする必要があります。

よろしくお願いします。

于 2013-03-30T18:33:34.797 に答える