Si tu fais comme ça, le code devient moins agréable à écrire et déroge à l'automatisme qui veut qu'un objet que tu n'as pas explicitement créé (avec new) ne t'appartient pas, donc que tu n'as pas à t'en occuper.
Par exemple avec ma solution je peux écrire ceci :
char *sayMyAge(int years) {
char *result = new char[256];
sprintf(result, "Wow, you are %d years old!");
return autorelease(result);
}
void caller() {
printf("%s\n", sayMyAge(42));
}
Alors qu'avec ta solution tu devras te préoccuper de la valeur de retour. C'est ennuyeux si elle t'est juste donnée à titre indicatif ou qu'elle ne t'intéresse pas*, et c'est un problème en cas de refactoring où tu as modifié une fonction retournant une primitive pour retourner cette fois un objet : il faut faire très attention partout où tu l'utilisais.
char *sayMyAge(int years) {
char *result = new char[256];
sprintf(result, "Wow, you are %d years old!");
return result;
}
void caller() {
char *temp = sayMyAge(42);
printf("%s\n", temp);
release(temp);
}
* Exemple d'API ou un même objet est retourné sans forcément une utilité réelle :
Image *image = new Image("m68k.png");
image->scale(2, 2)->rotate(30)->draw(0, 0);
Mais si tu évites ces constructions, c'est un compromis envisageable. On redéfinit la sémantique comme "tu es propriétaire de tout objet créé ou retourné, et pas le reste".