2010-12-06 3 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

Вы, вероятно, нужна блокировка мьютекса. Вы не можете просто добавлять и удалять память в поточных/межпроцессных приложениях, считая, что один поток/процесс может пытаться получить доступ к памяти, а другой в настоящее время использует его.

Смежные вопросы