У вас есть ряд проблем. Очевидным является то, что вы не создаете вашего объекта. В непрозрачной форме вы сейчас делаете:
class Foo;
Foo * p = get_memory();
p->bar = 5; // ouch!
Что вы должны делать, по крайней мере:
void * addr = get_memory(sizeof(Foo));
Foo * p = ::new (addr) Foo;
// do work
p->~Foo(); // done
(Просто замените Foo
на LOCK
для вашей ситуации.)
Однако все становится сложнее: vector
и string
сами требуют динамического выделения. Эта память должна находиться в том же адресном пространстве, что и ваш LOCK
. Поэтому стандартный способ решить эту проблему - написать свой собственный распределитель и передать следующее:
template <template <typename> class Alloc>
struct Lock
{
typedef std::basic_string<char, std::char_traits<char>, Alloc<char>> shared_string;
shared_string name;
shared_string type;
std::vector<shared_string, Alloc<shared_string>> pids;
};
Наконец, вы должны написать соответствующий класс распределителя, который помещает память в то же адресное пространство, что и пространство, в котором ваш LOCK
объект в конечном итоге перейдет:
template <typename T>
class shared_allocator { /* write this! */ }
typedef Lock<shared_allocator> LOCK;