Указатель переменной общей памяти становится недействительным после выхода из области видимости функции

Я пытаюсь создать функцию-оболочку, которая может соединяться с элементами контейнера внутри сегмента общей памяти, используя boost :: interprocess. Но по какой-то причине элемент контейнера доступен только внутри функции-оболочки, хотя объект сегмента разделяемой памяти помещается в глобальную область видимости. Что меня действительно смущает, так это то, что когда я помещаю подпрограмму соединения в основную функцию в отдельных областях, контейнер остается доступным после выхода из области действия подпрограммы соединения.

Моя процедура подключения:

#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <iostream>

namespace bi = boost::interprocess;

bi::managed_shared_memory segment(bi::open_only, "MySharedMemory");template <class T>
void smVariableConnect(const char* smVariableDescriptor, T* out_smVariable)
{
std::pair<T*, std::size_t> resource;

resource = segment.find<T>(smVariableDescriptor);
assert(resource.second == 1);
out_smVariable = resource.first;

for(unsigned int i = 0; i < out_smVariable->size(); i++)    // This works fine
std::cout << (*out_smVariable)[i] << std::endl;
}

int main ()
{
namespace bi = boost::interprocess;

typedef bi::allocator<int, bi::managed_shared_memory::segment_manager> ShVectorAllocator;
typedef bi::vector<int, ShVectorAllocator> SharedVector;

SharedVector* sv = nullptr;

/*  **1**
{
std::pair<SharedVector*, std::size_t> res;
res = segment.find<SharedVector>("sharedVector");
assert(res.second == 1);
sv = res.first;
}
*/

/* **2** */
smVariableConnect<SharedVector>("sharedVector", sv);
/*       */

// Workds fine when using method 1, crashes when using method 2
for(unsigned int i = 0; i < sv->size(); i++)
std::cout << (*sv)[i] << std::endl;

std::cin.get();
return 0;
}

Исходный код приложения, которое создает сегмент разделяемой памяти и помещает в него векторный контейнер, можно найти здесь http://pastebin.com/QHpwNVZ0 (Почему нет функции спойлера OO)

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]