En bref, ma question est: Si vous avez la classe MyClass<T>
, comment pouvez-vous changer la définition de classe pour prendre en charge les cas où vous avez MyClass<T, Alloc>
, similaire à comment, disons , Le vecteur STL fournit.Ajout d'un allocateur à un modèle de classe C++ pour la création d'objets en mémoire partagée
J'ai besoin de cette fonctionnalité pour prendre en charge un allocateur pour la mémoire partagée. Plus précisément, j'essaie d'implémenter un tampon circulaire dans la mémoire partagée. Actuellement, il a le cteur suivant:
template<typename ItemType>
SharedMemoryBuffer<ItemType>::SharedMemoryBuffer(unsigned long capacity, std::string name)
où ItemType
est le type des données devant être placées dans chaque fente de la mémoire tampon.
Maintenant, cela fonctionne splendide lorsque je crée le tampon du programme principal ainsi
SharedMemoryBuffer<int>* sb;
sb = new SharedMemoryBuffer<int>(BUFFER_CAPACITY + 1, sharedMemoryName);
Cependant, dans ce cas, le tampon lui-même est pas créé dans la mémoire partagée et est donc pas accessible à d'autres processus. Ce que je veux faire est d'être en mesure de faire quelque chose comme
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);
Cependant, je ne sais pas comment aller sur l'ajout d'un allocateur explicite au modèle de classe.
Je ne comprends pas très bien ce que vous demandez. Avez-vous besoin de savoir comment ajouter un paramètre template à votre template de classe (auquel cas vous devrez probablement montrer la définition actuelle de la classe), ou avez-vous juste besoin de savoir comment construire un objet à un emplacement donné en mémoire (dans ce cas, vous devriez rechercher _placement new_). De toute façon, je serais très prudent de mettre des objets non-POD dans la mémoire partagée. Est-il possible de construire à partir d'un processus et détruire d'un autre? Êtes-vous complètement sûr que tous les membres du groupe peuvent gérer cela? –
Je suppose que ma question peut simplement être paraphrasée comme: comment pouvez-vous créer votre objet dans la mémoire partagée (par opposition à le créer sur le tas en cours et le faire * utiliser * la mémoire partagée.) – recipriversexclusion
Dans ce cas, vous avez besoin de placement. par exemple. si 'shm_addr' est un pointeur' void * 'vers la mémoire partagée, vous pouvez faire' MyBuffer * pBuf = new (shm_Addr) MyBuffer; 'et le nouveau' MyBuffer' sera construit à l'emplacement donné. –