Насколько я понимаю, этот код может хранить вектор в файле.
using Alloc = boost::interprocess::allocator<int32_t, boost::interprocess::managed_mapped_file::segment_manager>;
using Vec = boost::interprocess::vector<int32_t, Alloc>;
void f() {
boost::interprocess::managed_mapped_file seg(boost::interprocess::open_or_create, "data.dat", 1024);
auto vec = seg.find_or_construct<Vec>("vec")(seg.get_segment_manager());
// ......
}
Однако, когда вектор пытается получить слишком много байтов, он выдает bad_alloc
исключение.
Я не могу предсказать, сколько байтов требуется, поэтому я придумал увеличивать файл, когда free_memory уменьшается. Однако иногда происходит сбой утверждения при росте.
Вот минимальный код.
using Alloc = allocator<int32_t, managed_mapped_file::segment_manager>;
using Vec = vector<int32_t, Alloc>;
void test(int, int);
int main()
{
test(4096, 4); // Change this value if not reproduced
return 0;
}
void test(int initialBytes, int extraBytes) {
fprintf(stderr, "test(%d, %d)\n", initialBytes, extraBytes);
remove("data.dat");
auto seg = make_unique<managed_mapped_file>(open_or_create, "data.dat", initialBytes);
auto vec = seg->find_or_construct<Vec>("vec")(seg->get_segment_manager());
fprintf(stderr, "vec->capacity=%ld\n", vec->capacity());
fprintf(stderr, "seg.get_free_memory()=%ld\n\n", seg->get_free_memory());
seg = nullptr;
fprintf(stderr, "tag1\n");
boost::interprocess::managed_mapped_file::grow("data.dat", extraBytes);
fprintf(stderr, "tag2\n");
seg = make_unique<managed_mapped_file>(open_only, "data.dat");
fprintf(stderr, "tag3\n");
vec = seg->find<Vec>("vec").first;
fprintf(stderr, "tag4\n");
fprintf(stderr, "vec->capacity=%ld\n", vec->capacity());
fprintf(stderr, "seg.get_free_memory()=%ld\n\n", seg->get_free_memory());
}
Еще меньше
void test(int initialBytes, int extraBytes) {
remove("data.dat");
auto seg = std::make_unique<managed_mapped_file>(open_or_create, "data.dat", initialBytes);
seg = nullptr;
managed_mapped_file::grow("data.dat", extraBytes);
}
Задайте вопрос: Как я могу хранить вектор elasti c, не предполагая максимума размер?
Я неправильно понял grow
- это функция c. Поэтому я исправил код. Все еще не подтверждается утверждение.
Я обнаружил, что утверждение не удалось, когда 4 <= extraBytes && extraBytes < 24