總之,我的問題是:如果您有類MyClass<T>
,如何更改類定義以支持您有MyClass<T, Alloc>
的情況,類似於說,STL向量提供。將分配器添加到C++類模板以創建共享內存對象
我需要此功能來支持共享內存的分配器。具體來說,我試圖在共享內存中實現一個環形緩衝區。目前,它具有以下的構造函數:
template<typename ItemType>
SharedMemoryBuffer<ItemType>::SharedMemoryBuffer(unsigned long capacity, std::string name)
其中ItemType
是數據的類型被放置在緩衝器中的每個時隙。現在
,當我從主程序創建緩衝區從而
SharedMemoryBuffer<int>* sb;
sb = new SharedMemoryBuffer<int>(BUFFER_CAPACITY + 1, sharedMemoryName);
然而,在這種情況下,緩衝器本身未在共享內存中創建的,因此不會出現在其他進程訪問這個工作出色。我想要做的是能像做
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
typedef SharedMemoryBuffer<int, ShmemAllocator> MyBuffer;
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
const ShmemAllocator alloc_inst (segment.get_segment_manager());
MyBuffer *mybuf = segment.construct<MyBuffer>("MyBuffer")(alloc_inst);
不過,我不知道如何去增加一個明確分配給類模板。
我不太明白你在問什麼。你是否需要知道如何將模板參數添加到類模板中(在這種情況下,您可能需要顯示該類的當前定義),還是隻需要知道如何在內存中的給定位置構造對象(在這種情況下,您應該搜索_placement new_)。無論哪種方式,我都會非常謹慎地將非POD對象放在共享內存中。是否有可能從一個過程構建並從另一個過程中摧毀?你完全確定所有的班級成員都可以處理這個問題嗎? – 2010-03-11 07:44:24
我想我的問題可以簡單地轉述爲:如何在共享內存中創建對象(與在當前進程堆上創建它並使用共享內存相對)。 – recipriversexclusion 2010-03-11 07:44:39
在這種情況下,您需要新放置。例如如果'shm_addr'是共享內存的'void *'指針,你可以使用'MyBuffer * pBuf = new(shm_Addr)MyBuffer;'和新的'MyBuffer'將在給定的位置構造。 – 2010-03-11 07:46:44