2010-12-06 104 views
0

我創建了一個共享內存,其中包含一個列表。我需要連續添加節點到列表中。 我的另一個應用程序讀取列表並彈出讀取的內容。 我面臨的問題是彈出的節點不釋放內存,所以當第一個應用程序不斷插入點時,它會引發分段錯誤。請指導我如何釋放節點,以便我的第一個應用程序可以使用該空間分配新節點。使用boost庫釋放共享內存中的節點內存

的片段我的代碼是

#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/managed_shared_memory.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/containers/list.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/interprocess/allocators/allocator.hpp> 
#include </tcs/dev/lib/boost_1_38_0/boost/multi_index_container.hpp> 

#include <algorithm> 
#include<iostream> 
using namespace std; 
using namespace boost; 
using namespace multi_index; 

class marketdata 
{ 
    public: 
    int x; 
    float y; 
}; 


int main() 
{ 
    marketdata m[0]; 
    m[0].x=1; 
    m[0].y=1; 
    // boost::interprocess::list iterator itr; 

    using namespace boost::interprocess; 
    try{ 
     managed_shared_memory segment 
     (open_only 
     ,"MySharedMemory"); //segment name 
     typedef boost::interprocess::allocator<marketdata, managed_shared_memory::segment_manager> 
     ShmemAllocator; 
     typedef boost::interprocess::list<marketdata, ShmemAllocator> MyList; 
     MyList *mylist = segment.find<MyList>("MyList").first; 
boost::interprocess::list<marketdata, ShmemAllocator> :: iterator itr; 
      for(itr=mylist->begin(); itr != mylist->end(); ++itr) 
       { cout << (*itr).x << " "; 
       cout << endl; 
       mylist->pop_front(); 
       //multi_index::multi_index_container::delete_node_(itr); 
       sleep(1); 
       } 

     segment.destroy<MyList>("MyList"); 
    } 
    catch(...){ 
     shared_memory_object::remove("MySharedMemory"); 
     throw; 
    } 
    shared_memory_object::remove("MySharedMemory"); 
    return 0; 
} 
+0

爲什麼你的絕對路徑包括?這將使升級到更高版本真的很爛! – 2010-12-06 06:25:21

+0

感謝比利你的建議。這只是爲了一些測試目的,所以增加了絕對路徑。肯定會改變這個 – user531805 2010-12-06 06:42:26

回答

0

你可能需要一個互斥鎖。您不能只在線程/進程間應用程序中添加和刪除內存,同時考慮到一個線程/進程可能正在嘗試訪問內存,而另一個線程正在使用它。