Boost: Sérialisation: Qui nettoie les données désérialisées?

Je suis en train de sérialiser et d’envoyer un pointeur brut d’un object à une autre application.

En désérialisant, j’obtiens un autre pointeur brut. Cela signifie que Boost :: Serialization est en train de construire l’object derrière ce pointeur. Je suis maintenant curieux de savoir qui a la propriété de l’object et si Boost supprimera cet object s’il n’en a plus besoin.

Un code qui montre peut-être mieux la question:

void anyMethod() { std::ifstream file("archiv.txt"); boost::archive::text_iarchive ia(file); AnyClass* object; ia >> object; //work with object } //Now what has happened to object? //Is it deleted, cause it went out of scope? //Do I have to delete it myself? 

D’après ma compréhension de la documentation relative à la sérialisation des pointeurs, l’archive conserve la propriété: “Le fait de charger le même object pointeur plusieurs fois entraîne la création d’un seul object, ce qui permet de répliquer la configuration d’origine du pointeur”. Cela tend à indiquer que la bibliothèque gère la comptabilité.

En outre, l’archive fournit une méthode delete_created_pointers : “Supprime tous les objects créés par le chargement de pointeurs. Cela peut être utilisé pour éviter les memory leaks qui pourraient autrement se produire si des pointeurs sont chargés et que le chargement d’archives rencontre une exception”.

Je ne comprends pas pourquoi AnyClass* object; est légal dans ce contexte, IMO vous devez avoir un object AnyClass (regardez http://en.highscore.de/cpp/boost/serialization.html ) puis le réutiliser encore et encore. Désormais, lorsque cet object (et non le pointeur) sera hors de scope, il sera supprimé.

Désolé de répondre à cette vieille question. J’ai essayé la démo et constaté qu’il y avait une fuite de mémoire. La démo restaure l’archive en un object (qui utilise des pointeurs en interne) dans une fonction. L’archive est détruite lorsque la fonction est retournée et l’object est renvoyé. La mémoire allouée n’est nettoyée par personne. J’ai modifié la démo pour exécuter la fonction de restauration plusieurs fois, puis j’ai constaté que le processus prenait de plus en plus de mémoire. Ainsi, si vous devez nettoyer la mémoire allouée, supprimez manuellement les objects via le pointeur ou appelez delete_created_pointers ().