2010-03-13 8 views
2

J'ai regardé la documentation de Boost.Interprocess pendant des heures mais je n'ai toujours pas réussi à comprendre cela. Dans le doc, ils ont an example de créer un vecteur dans la mémoire partagée comme ceci:Comment passer des paramètres à manage_shared_memory.construct() dans Boost.Interprocess

//Define an STL compatible allocator of ints that allocates from the managed_shared_memory. 
//This allocator will allow placing containers in the segment 
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator; 

//Alias a vector that uses the previous STL-like allocator so that allocates 
//its values from the segment 
typedef vector<int, ShmemAllocator> MyVector; 

int main(int argc, char *argv[]) 
{ 
    //Create a new segment with given name and size 
    managed_shared_memory segment(create_only, "MySharedMemory", 65536); 
    //Initialize shared memory STL-compatible allocator 
    const ShmemAllocator alloc_inst (segment.get_segment_manager()); 
    //Construct a vector named "MyVector" in shared memory with argument alloc_inst 
    MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst); 

Maintenant, je comprends cela. Ce que je suis coincé est comment passer un deuxième paramètre à segment.construct() pour spécifier le nombre d'éléments. Le document donne interprocessus le prototype de construct() comme

MyType *ptr = managed_memory_segment.construct<MyType>("Name") (par1, par2...); 

mais lorsque je tente

MyVector *myvector = segment.construct<MyVector>("MyVector")(100, alloc_inst); 

Je reçois des erreurs de compilation.

Mes questions sont les suivantes:

  1. qui obtient effectivement passé les paramètres par1, par2 de segment.construct, le constructeur de l'objet, par exemple vector? Ma compréhension est que le paramètre allocator de modèle est passé. Est-ce exact?
  2. Comment puis-je ajouter un autre paramètre, en plus de alloc_inst, requis par le constructeur de l'objet créé dans la mémoire partagée?

Il existe très peu d'informations autres que les docs Boost sur ce sujet.

Répondre

3

J'ai posé la même question sur la liste de diffusion des utilisateurs boost et Steven Watanabe replied que le problème était simple: std :: vector n'a pas de constructeur du type (size, allocator). En regardant la documentation que je vois que le constructeur est

vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

si l'appel doit être correct

MyVector *myvector = segment.construct<MyVector>("MyVector")(100, 0, alloc_inst); 

élémentaire, mon cher Watson, élémentaire!

Questions connexes