Я использую общий вектор для обмена объектами в памяти:
using ShmemAllocator = bip::allocator<T, bip::managed_shared_memory::segment_manager>;
using MyVector = bip::vector<T, ShmemAllocator>;
bip::permissions perm;
perm.set_unrestricted();
segment.reset(new bip::managed_shared_memory(bip::open_or_create, shared_memory_name, numBytes, 0, perm));
const ShmemAllocator alloc_inst(segment->get_segment_manager());
vec = segment->find_or_construct<MyVector>(shared_vector_name)(alloc_inst);
Обратите внимание, что вектор создается внутри объекта managed_shared_memory
, и он создается путем указания количества байтов, а не количества элементов вектора.
Затем я записываю элементы в вектор:
int write(const std::vector<T>& vec)
{
bip::scoped_lock<bip::named_mutex> lock(*sdc.mutex);
for(const auto& item : vec)
{
sdc.vec->push_back(item);
}
sdc.cond_empty->notify_all();
}
Каков самый безопасный способ проверить, достаточно ли у меня места для записи всех моих элементов перед записью? Мне бы очень хотелось избежать простого назначения большого количества байтов в надежде, что я никогда не нажму!
vector::reserve
? - person user7860670   schedule 16.05.2018capacity()
— правильный ответ на вопрос, выделенный полужирным шрифтом Каков самый безопасный способ проверить, достаточно ли у меня места для записи всех элементов перед записью?. Однако предыстория предполагает, что вы хотите знать, как мне убедиться, что мой сегмент памяти достаточно велик, чтобы содержать мои данные (например, вектор)? что я ответил в мой вопрос. - person sehe   schedule 18.05.2018