Je sais que le titre semble familier car il y a beaucoup de questions similaires, mais je demande un aspect différent du problème (je connais la différence entre avoir des choses sur la pile et les mettre sur le tas).
En Java, je peux toujours renvoyer des références à des objets "locaux"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
En C ++, pour faire quelque chose de similaire, j'ai 2 options
(1) Je peux utiliser des références chaque fois que j'ai besoin de "retourner" un objet
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Alors utilisez-le comme ça
Thing thing;
calculateThing(thing);
(2) Ou je peux renvoyer un pointeur vers un objet alloué dynamiquement
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Alors utilisez-le comme ça
Thing* thing = calculateThing();
delete thing;
En utilisant la première approche, je n'aurai pas à libérer de la mémoire manuellement, mais pour moi, cela rend le code difficile à lire. Le problème avec la deuxième approche est, je dois m'en souvenir delete thing;
, qui n'a pas l'air très bien. Je ne veux pas renvoyer une valeur copiée car elle est inefficace (je pense), alors voici les questions
- Existe-t-il une troisième solution (qui ne nécessite pas de copier la valeur)?
- Y a-t-il un problème si je m'en tiens à la première solution?
- Quand et pourquoi devrais-je utiliser la deuxième solution?