
Stephan Menzel escribió:
Just an update
On Wed, Sep 23, 2009 at 3:43 PM, Stephan Menzel <stephan.menzel@gmail.com> wrote:
ptr = m_segment->allocate_aligned(static_cast<size_t>(rawsize), 128);
Now after a while the segment will have no more room for further blocks. So I delete some of them to gain more room:
m_segment->deallocate(raw.get()); ...
This makes me believe that either deallocate didn't do a good job...
Actually it just turned out this is the case. I tried among many other things replacing the allocate_aligned() with an ordinary allocate() and this works. So I'm afraid this looks a lot like a bug in interprocess to me. Pointers returned by allocate_aligned are aligned but cannot be deallocated. At least not in a way that would have the mem actually available afterwards.
Can you give me a use case to reproduce the problem? This seems to work in may windows machine: #include <vector> #include <boost/interprocess/managed_windows_shared_memory.hpp> int main() { using namespace boost::interprocess; typedef boost::interprocess:: managed_windows_shared_memory shared_segment; std::vector<void *> ptrs; shared_segment m_segment(create_only, "shmem", 4096*16); try{ while(1){ //Now I have several allocate_aligned operations: ptrs.push_back(m_segment.allocate_aligned(128, 128)); } } catch(...){ m_segment.deallocate(ptrs.back()); ptrs.pop_back(); ptrs.push_back(m_segment.allocate_aligned(128, 128)); } return 0; } Ion