[C++ DL Linux] invalid pointer

invalid pointer [C++ DL Linux] - C++ - Programmation

Marsh Posté le 31-01-2006 à 20:02:16    

J'utilise cette classe pour charger des .so, le fonctionnement est assez simple :
 

Code :
  1. class DynamicLibrary {
  2. private:
  3. void* m_handle;
  4. public:
  5. DynamicLibrary() : m_handle(NULL) {}
  6. ~DynamicLibrary() {}
  7. // Ouverture de la librairie dynamique à l'adresse "path". S'il y a une erreur,
  8. // la fonction renvoie false, sinon true. Si auto_add_suffix est à true, le suffixe
  9. // .dll ou .so est automatiquement ajouté (selon l'OS sur lequel on compile).
  10. inline bool Open(const char* path, bool auto_add_suffix=true);
  11. // Fonction renvoyant un pointeur vers le symbole demandé s'il est trouvé, sinon
  12. // elle renvoie NULL.
  13. inline void* GetSymbol(const char* symbol_name);
  14. // Fermeture de la librairie.
  15. inline void Close();
  16. };
  17. bool DynamicLibrary::Open(const char* path, bool auto_add_suffix) {
  18. if(auto_add_suffix)
  19. {
  20.  char* buffer = new char[strlen(path)+4];
  21.  sprintf(buffer, "%s.so", path);
  22.  m_handle = dlopen(buffer, RTLD_LAZY);
  23.  char* erreur = dlerror();
  24.  if (erreur) printf("ERROR : %s\n", erreur);
  25.  delete [] buffer;
  26. }
  27. else
  28.  m_handle = dlopen(path, RTLD_LAZY);
  29. return m_handle != NULL;
  30. }
  31. void* DynamicLibrary::GetSymbol(const char* symbol_name) {
  32. return dlsym(m_handle, symbol_name);
  33. }
  34. void DynamicLibrary::Close() {
  35. if(m_handle != NULL)
  36. {
  37.  printf("Arret d'un module : " );
  38.  dlclose(m_handle);
  39.  m_handle = NULL;
  40.  printf("ok\n" );
  41. }
  42. }


 
Tout fonctionne à merveille sauf que au niveau de dlclose() j'obtient :

Citation :

*** glibc detected *** free(): invalid pointer: 0x0000000000721ca8 ***


 
Et lorsque je l'enleve ça marche (sauf que ça ferme pas comme il faut la lib "dl" )
 
dlclose n'est jamais sensé planter même avec un pointeur foireux (et je suis sur que non).

Reply

Marsh Posté le 31-01-2006 à 20:02:16   

Reply

Marsh Posté le 31-01-2006 à 20:05:02    

Et la RAII :o ton close devraient etre dans le destructeur je pense.


Message édité par Joel F le 31-01-2006 à 20:07:18
Reply

Marsh Posté le 31-01-2006 à 20:56:16    

et l'assignation et la copie ne sont pas safe, il faut au moin un constructeur qui appel open, un destructeur qui appel close, le constructeur par copie et l'operateur d'affectation définies

Reply

Marsh Posté le 31-01-2006 à 21:33:19    

Reply

Marsh Posté le 31-01-2006 à 21:34:50    

oui

Reply

Marsh Posté le 03-02-2006 à 22:39:41    

Si je ne l'ai pas mis de un déstructeur il y a peut être une raison.
 
Sinon ça peut pas être dû à un truc genre dlclose(NULL) car il vérifie avant.

Reply

Marsh Posté le 04-02-2006 à 13:55:53    

RaphAstronome a écrit :

Si je ne l'ai pas mis de un déstructeur il y a peut être une raison.


 
pour quelle raison tu ne le met pas dans destructeur ? en fait c'est quoi l'interet d'utiliser une classe dans ce cas ? (surtout que à par ca c'est du C)
 
Pour le bug si ca ne peut pas etre un dlclose sur un handle deja fermé alors c'est que l'espace memoire ou se trouve l'objet est corrompu, faut voir du coté du code appelant

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed