1

期待どおりに動作しない、迅速で汚いベクトルのシリアライゼーションを実行しようとしています。問題は、ファイルからベクターを読み取ろうとするときのセグメンテーション違反です。ファイル オフセットとベクトル サイズをヘッダーに格納します。コードは次のとおりです。

// writing
std::vector<size_t> index;

header.offset = ofs.tellp();
header.size = sizeof(index);
ofs.write((char *) &index[0], sizeof(index)); // pretty bad right, but seems to work   

// reading
std::vector<size_t> index;
index.resize(header.numElements)

ifs.seekg(header.offset);
// segfault incoming
ifs.read((char *) &index[0], header.size);

正直なところ、これが機能した場合は驚くでしょうが、私が望むものを達成するための適切な方法が何であるかはわかりません. 私はブーストから離れたいと思っていますが、私はすでに Qt を使用しているので、QVector または QByteArray が何らかの形で役立つ場合は、これらを使用できます。

4

2 に答える 2

3

sizeofあなたが思っていることをしませんvector。ベクトルに割り当てられたメモリのサイズをバイト単位で取得したい場合は、index.size() * sizeof(size_t). index.size()はベクトルの要素数で、ベクトルsizeof(size_t)の 1 つの要素のサイズです。

修正されたコードは次のようになります (余分なものをトリミング):

// writing...
std::vector<size_t> index;

size_t numElements = index.size();
size_t numBytes = numElements * sizeof(size_t); // get the size in bytes
ofs.write((char *) &index[0], numBytes);

// reading...
std::vector<size_t> index;
index.resize(numElements);

ifs.read((char *) &index[0], numBytes); // again, numBytes is numElements * sizeof(size_t)

実際に何をするかというsizeof(index)と、実際のベクトル オブジェクトのサイズを返します。ベクトルが格納する要素は、そのサイズとは別のものです。例えば:

int* array = new int[500];
// sizeof(array) is the size of the pointer, which is likely 4 or 8 bytes if you're on 32 or 64 bit system
于 2012-11-24T23:36:44.197 に答える
0

ベクトルへのポインターを使用しようとします。データ型への参照を使用しようとしています。C++ がタイプセーフになろうとしている場合、うまくいかないかもしれません

于 2012-11-24T23:36:29.163 に答える