ファイルのサイズに合わせてバッファを割り当てる関数があります
char *buffer = new char[size_of_file];
iはバッファーをループし、いくつかのポインターをサブバッファーにコピーして、より小さな単位で処理します。
char *subbuffer = new char[size+1];
for (int i =0; i < size; i++) {
subbuffer[i] = (buffer + cursor)[i];
}
次に、関数を呼び出して、このサブバッファーと、サブバッファー内の場所の任意のカーソル、および抽象化するテキストのサイズを渡します。
wchar_t* FileReader::getStringForSizeAndCursor(int32_t size, int cursor, char *buffer) {
int wlen = size/2;
#if MARKUP_SIZEOFWCHAR == 4 // sizeof(wchar_t) == 4
uint32_t *dest = new uint32_t[wlen+1];
#else
uint16_t *dest = new uint16_t[wlen+1];
#endif
char *bcpy = new char[size];
memcpy(bcpy, (buffer + cursor), size+2);
unsigned char *ptr = (unsigned char *)bcpy; //need to be careful not to read outside the buffer
for(int i=0; i<wlen; i++) {
dest[i] = (ptr[0] << 8) + ptr[1];
ptr += 2;
}
//cout << "size:: " << size << " wlen:: " << wlen << " c:: " << c << "\n";
dest[wlen] = ('\0' << 8) + '\0';
return (wchar_t *)dest;
}
ファイルをループしている間、これを構造体のプロパティとして値に格納します。
私の問題は、サブバッファーを解放し、構造体ポインターの配列、アプリのsegfaultsをループして、構造体のタイトルプロパティの読み取りを開始したときのようです。GDBは正常に終了したと言っていますが、私が数えたレコードがたくさんありません。
これは何かの関数スコープに関係しているのではないかと思います。getStringForSizeAndCursorのmemcpyは、解放する前にサブバッファーの外にバイトをコピーしているため、segfaultを修正すると思いました。今のところ、それらはstruct deconstructorによってクリーンアップされると思いますが、期待する前に分解されているか、一部のメモリが元のサブバッファーをまだ指している場合、サブバッファーをリークさせると、期待したデータが返されますが、これは解決策ではありません。