2011-02-01 3 views
0

Je veux savoir si je peux écrire dans un fichier (mémoire partagée avec boost) un char *. J'ai créé un Template, et fonctionne bien avec "int" et "string", mais avec char *, je peux y accéder en mémoire, quand j'exécute le programme, mais les données ne sont pas stockées dans le fichier après, comme cela arrive avec des ints et des cordes.copie char * dans la mémoire partagée boost

La pièce représentative du code serait: (T serait char *)

//DECLARATIONS 
MyMap *mymap; 
managed_mapped_file seg = managed_mapped_file(open_or_create, tableName, tablesize); 
mymap = seg->find_or_construct<MyMap>("MyMap")  //object name 
      (std::less<T>() //first constructor parameter 
      ,*alloc_inst); //second constructor parameter 

//THE METHOD TO ADD THE ENTRIES 
template<class T> 
void ShareDB<T>::add_ref_info_to_db (const T &Symbol_Index , const std::string &a_info){ 

MyMap::iterator res = mymap->find(Symbol_Index); 

mymap->insert(std::pair<const T, shared_string>(Symbol_Index, localSymbol)); 

je donne la parole au modèle comme ça:

ShareDB <char *> ex; 
ex.openDB(dataBaseName,"TestMutex", 196608, true); 
ex.add_ref_info_to_db (a,ex.RefInfoRecord); 

Peut-être qu'il est juste que je peux ne pas écrire des pointeurs ... Je ne suis pas sûr ...

Merci à l'avance

+0

Vous utilisez une carte avec un pointeur comme clé, cela n'a pas de sens. Plutôt que 'char *' comme clé, utilisez 'std :: string' comme clé de votre map. Aussi, sans voir ce que fait votre fonction 'MyMap :: insert()' avec le 'char *' il est difficile de dire ce qui ne va pas ... – Nim

+0

Je suis d'accord avec Nim plus de code pertinent aiderait, la définition de insert() , le code qui écrit réellement la valeur, toute copie ou assignation de Symbol_Index, etc. – AJG85

Répondre

1

au lieu de template<class T> considérez template<typename T> ... cependant j'utiliserais simplement std::string à moins que vous ne devez soutenir spécifiquement char *.

+0

Je dois supporter char * ... le seul problème est qu'il semble qu'à la fin il n'écrit pas le char * en mémoire, le reste du comportement est bien ... une suggestion? – david

+0

Avez-vous essayé de changer le modèle pour utiliser le nom de fichier? Bien qu'ils soient généralement les mêmes dans certains compilateurs, l'utilisation de typename fonctionne mieux avec les types entiers qui ne sont pas des objets définis par l'utilisateur tels que int, double, char ... Avez-vous une sortie quelconque? La sortie inattendue autre que les caractères désirés pourrait être un indice quant à ce qui se passe réellement. – AJG85

Questions connexes