我有一个向量要在程序运行之间保存,我需要将其保存为char *到内存。我决定将向量中的字节转换为char *读取,然后稍后再次读取,并将字节作为向量(类型不变)读取,因此在运行之间保存了它。问题在于该方法似乎不起作用。我正在设法保存包含有关向量的数据的24个字节,但是向量所包含的值已更改。我用int尝试了此方法,在这种情况下它似乎可以工作。
我阅读了有关该主题的其他文章,其中矢量中的值是指针。我知道为什么这行不通,但是在我的情况下,值是std :: pairs,所以这不应该成为问题。
编辑:我的代码。我肯定知道read()和write()函数可以正常工作。 writeOrigin()和setUpOrigin()做与问题无关的事情。当我在不向向量添加任何内容的情况下运行代码时,它可以工作,但是当我向其添加任何值时,当我尝试将值从_inodes复制到inode时,它会崩溃。 inode是我之前制作的一个类,但是该对中的int也出现了问题。
void MyFs::writeInodes(){
static int count = 0;
int size = sizeof(inodes) + sizeof(std::pair<int, inode>) * inodes.capacity();
blkdevsim->write(SIZEOF_HEADER, sizeof(size), (char*)(&size));
blkdevsim->write(SIZEOF_HEADER + sizeof(size), size, (char*)(&inodes));
writeOrigin();
count++;
}
void MyFs::getInodes(){
static int count = 0;
if(0 == count){
count++;
int size = 0;
std::vector<std::pair<int, inode> >* _inodes;
blkdevsim->read(SIZEOF_HEADER, sizeof(size), (char*)(&size));
_inodes = (std::vector<std::pair<int, inode> >*)malloc(size);
blkdevsim->read(SIZEOF_HEADER + sizeof(size), size, (char*)_inodes);
for(unsigned int i = 0; i < _inodes->size(); i++){
std::cout << _inodes->at(i).first << std::endl;
inodes.push_back((*_inodes)[i]);
}
free(_inodes);
setUpOrigin();
}
}
void BlockDeviceSimulator::read(int addr, int size, char *ans) {
memcpy(ans, filemap + addr, size);
}
void BlockDeviceSimulator::write(int addr, int size, const char *data) {
memcpy(filemap + addr, data, size);
}
答案 0 :(得分:2)
尽管std::vector
的实现在实现之间可能有所不同,但它们都是以下(高度简化)的变体:
template <typename T>
struct vector {
T* storage;
int size;
};
换句话说,在内存中构成std::vector
的位模式不包含实际内容,仅包含指向它的指针。您将需要自己为向量实现序列化格式(有时称为编组)。
例如,您可以使用protocol buffers或cap'n proto。