
Hello Ion,
T * ptr = shmem_segment.create<T>("ObjectName")[size] /*proxy returned here, calls operator() of the object*/ (arg1, arg2, ...argN);
When reading your question (no answer for it, at least now) it come to my mind: - maybe there should be smart pointer for shmem and version of create() which returns smart pointer. It would result in greater safety of the library. Something as: // helper class, returned by segment::create(), // not to be used as is, only for conversion // to T* or to smart pointer template<typename T> class shmem_smart_pointer_proxy { shmem_smart_pointer_proxy(T* p_, segment* seg_) p(p_), seg(seg_) {} public: ~shmem_smart_pointer_proxy() { if (p) seg->destroy(p); } operator T*() { T* aux = p; p = 0; return aux; } // assigned to raw pointer private: T* p; segment* seg; }; // the smart pointer template<typename T> class shmem_smart_pointer { public: shmem_smart_pointer(const shmem_smart_pointer_proxy& aux) { p = aux.p; aux.p = 0; seg = aux.seg; } T* operator->() { ...} ~shmem_smart_pointer() { if (p) seg->destroy(p); } private: T* p; segment* seg; }; shmem_smart_pointer_proxy,T> = shmem_segment.create<T>("ObjectName")[size] (arg1, arg2, ...argN); It could be then used: T* t = segment.create(...); // no smarteness used shmem_smart_pointer ptr = segment_create(...); // smart ptr used (void)segment.create(...); // no leak happens but not as: segment.create(...)->do_something(); // this would probably be error anyway /Pavel