J'ai souvent le dileme suivant. Je doit faire une fonction qui retourne une copy de donnée(s) et j'hésite toujours entre alloué la mémoire dans ma fonction et retourné un pointeur sur ce que j'ai alloué(solution 1) ou demander à lutilisateur de me passer un pointeur ou (une ref) sur de la mémoire que lui à alloué lui même et que je remplis.
solution 1:
definition de ma fonction:
utilisation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 mesDonnees * MaClasse::CopyDonnees() { mesDonnees * v_pRet = new mesDonnees; *v_pRet = m_ClasseDonnees; return v_pRet; }
solution 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 mesDonnees* v_pDonnees = v_aInstance.Copy(); /* utilisation des donnees */ delete v_pDonnees;
definition de ma fonction:
utilisation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void MaClasse::CopyDonnees(mesDonnees * _pToFill) { _pToFill = *m_ClasseDonnees; return; }
l'expérience montre que si on utilise la première solution, lutilisatuer ne lit jamais la doc et oublie le delete. Donc fuite mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 mesDonnees* v_pDonnees = new mesDonnees; v_aInstance.Copy(v_pDonnees); /* utilisation des donnees */ delete v_pDonnees;
Mais la solution 2 n'est pas forcément très souple, notament en cas tableau de taille variable, ou même au niveau de l'encapsulation. Par exemple si ma fonction calcul une clée à utiliser comme entrée d'un conteneur assiociatif et que je veut modifier mon algo et que cela fasse varier la taille de ma clé.
Donc voilà vous qu'en pensez vous solution 1, 2, ou une autre encore mieux ?
Partager