Salut!
J'essaie de faire un gestionnaire de ressources, et je voudrais qu'il puisse se gérer dans un contexte multi-thread.
Je fais donc ceci :
J'instancie la ressource avec new (ou bien sans le new) ça dépend si j'ai besoin d'une allocation dynamique ou pas.
Je déplace le contenu de la ressource dans une autre variable qui n'est pas un pointeur.
Et j'utilise un compteur pour savoir combien de fois la ressource est copiée, ainsi, si elle est utilisée dans plusieurs thread, celle-ci n'est pas détruite tant que le thread n'a pas fini de l'utiliser.
Je voudrais un truc très similaire à std::shared_pointer mais sans devoir faire forcément un compteur de référence ou bien un pointeur car je pourrais très bien charger des ressource depuis la mémoire, ou bien depuis un fichier, sans devoir retourner un shared_ptr sur la ressource à chaque fois, car ça m'embête au plus au point de devoir le ré-écrire à chaque fois.
De plus mes ressource ne sont pas copiable, mais plutôt déplaçable, c'est donc un std::unique_ptr qui serait plutôt à utiliser dans ce cas, mais cette classe n'a pas de compteur de références.
Bref j'ai donc tenté de créer un code de ce genre (avec une capsule RAII autour) :
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int i = 1; int mi = std::forward<int>(i); std::cout<<&mi<<std::endl; delete &mi; std::cout<<&mi<<std::endl;
Malheureusement ce code crash lors de la deletion, et j'ai cette erreur à l'exécution :
Y a t'il moyen de libérer le contenu d'une ressource dont le contenu à été déplacer dans une autre variable ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 free() invalid pointer.
Ou bien faut t'il impérativement utiliser la même variable que celle qui alloue le contenu ?
Merci.
PS : je sais qu'il est impossible de libérer du contenu qui n'a pas été allouer avec new mais je chercher actuellement une alternative.
Partager