Linux C / C ++ allouer / libérer de la mémoire dans une bibliothèque dynamic

Je dois diviser mon application en plusieurs modules logiques.

mainapp :

  • module1.so
  • module2.so
  • module3.so
  • etc

Où chaque module est une bibliothèque *.so , qui sera chargée pendant l’exécution.

Chaque module partage la même interface et retournera un tableau de données. Par exemple:

int *ptr = module1->getIntData();

Est-il correct de libérer / supprimer cette mémoire côté mainapp ?

 int *ptr = module1->getIntData(); delete ptr; //(or free(ptr)) 

Qu’en est-il des implémentations malloc / free. Est-il possible que cette bibliothèque en utilise une autre, puis mainapp?

Je recommande fortement que le module qui effectue l’allocation soit également responsable de la désaffectation. Ainsi:

 int *ptr = module1->getIntData(); ... module1->freeIntData(ptr); 

Cela permet à différents modules d’utiliser différents allocateurs (malloc / free, new / delete, allocateur de brames, etc.) sans difficulté.

Sur les systèmes Posix, il ne peut y avoir qu’une seule implémentation de malloc (et free ) dans un processus. Par conséquent, si la définition de getIntData est “renvoie un pointeur qui doit être libéré par free “, tout irait bien. D’autre part, je pense qu’il serait possible d’écrire deux compilateurs C ++ qui pourraient être utilisés pour écrire module1 et module2, mais qui ne pourraient pas delete mémoire allouée par le new . (Bien que je ne pense pas que de tels compilateurs existent actuellement).

S’il y a la moindre lueur possible, vous devrez peut-être porter ce lot sous Windows, alors vous voulez vraiment que les modules libèrent la mémoire allouée. Différentes DLL peuvent avoir différents tas et toutes sortes de problèmes amusants peuvent en découler. (Comme le dit @trojanfoe dans les commentaires: la différence entre les versions de débogage et de publication peut être suffisante pour causer du chagrin.)

Je ne recommanderais d’utiliser std::unique_ptr si vous pouvez garantir que tous les modules seront toujours construits avec la même version du même compilateur en utilisant des indicateurs de compilateur identiques. (Je suis un fervent partisan de la simplicité des interfaces de bibliothèque dynamics, aussi proches de C que possible.)