• [^] # Re: memforget et fuite mémoire

    Posté par (site web personnel) . En réponse au journal cTypes + Rust = approfondir une relation d'amour et d'eau (fraîche). Évalué à 4. Dernière modification le 07 novembre 2022 à 14:39.

    Si j'en crois la doc, Python récupère le pointeur et créé via cTypes, tout le nécessaire pour gérer son cycle de vie. Donc non, il n'y a pas de risque.

    C'est quelle doc ?

    Python n'a aucun moyen de savoir comment il doit désallouer la mémoire, ni même si il doit la désallouer.

    Si tu wrap du code c++ et que tu retournes un pointeur sur un class, il faut appeler le
    destructeur. Python ne le connais pas. Pareil au niveau de Rust, il y a peut-être des drop à appeler.
    Voir même, il ne faut pas détruire la donnée. Image que ta box est dans un stockage de ta lib rust et que tu veux juste retourner un pointer sur cette valeur tout en gardant sa gestion mémoire dans rust : tu peux en récupérer un pointer en "coerçant" la référence (https://doc.rust-lang.org/std/primitive.pointer.html#common-ways-to-create-raw-pointers)
    mais python ne doit pas supprimer la mémoire. Donc Python ne doit pas le faire par défaut.

    Si tu veux que le code python supprime la mémoire, il faut repasser le pointer à rust pour qu'il le supprime comme il faut, probablement avec une fonction de ce type (si tu as utiliser Box::into_raw, à adapter aux cas d'usages) :

    #[no_mangle]
    #[allow(improper_ctypes_definitions)]
    pubunsafeextern"C"fn free_box(ptr: *mutc_int){
    drop(Box::from_raw(ptr));
    }

    Tu peux lancer ton programme avec valgrind pour voir si il y a des fuites mémoire.

    Matthieu Gautier|irc:starmad