я использую повышение :: межпроцессного :: managed_shared_memory чтобы поделиться некоторыми данными между различными процессами и было интересно, как работает очистка. В общем, у меня сложилась следующая ситуация:
boost::interprocess::managed_shared_memory *sharedSegment;
typedef boost::interprocess::allocator< MyObject, boost::interprocess::managed_shared_memory::segment_manager> SharedMemoryAlloc;
typedef boost::interprocess::vector<MyObject, SharedMemoryAlloc> SharedVector;
SharedVector *sVec;
unsigned int size;
// Do some other stuff and determine correct size
sharedSegment= new boost::interprocess::managed_shared_memory(boost::interprocess::create_only, "TEST", size);
SharedMemoryAlloc *allocToSharedSegment = new SharedMemoryAlloc(sharedSegment->get_segment_manager());
sVec = sharedSegment->construct<SharedVector>("MyVector")( (*allocToSharedSegment) );
delete allocToSharedSegment;
// Fill sVec, do some computation etc..
// Start cleanup
//sVec->clear();
delete sharedSegment;
boost::interprocess::shared_memory_object::remove("TEST");
Так как я вызываю boost :: interprocess :: shared_memory_object :: remove («TEST»); Я всегда думал, что все в памяти все равно удаляется, и поэтому мне не нужно заботиться о sVec. Но Visual Leak Detector сказал мне, что на этом этапе произошли утечки памяти. Если я удаляю вектор перед удалением общей памяти, все работает нормально.
Может ли быть так, что sVec содержит указатель внутри, и поэтому я должен вызвать clear ()?
Задача ещё не решена.
Других решений пока нет …