Salve a tutti, scrivo qui la prima volta.
Vi espongo il mio dubbio: in Java è normale creare delle funzioni che restituiscono oggetti String, mentre se non sbaglio in C++ ciò non andrebbe fatto, e bisognerebbe passare come parametro della funzione un riferimento alla variabile che conterrà il risultato.
Mi sono imbattuto però nel seguente caso:
Abbiamo una funzione in una DLL scritta in C++ (vecchio Visual studio 6). La DLL viene chiamata all'occorrenza da un programma che passa dei parametri e che riceve una string dalla DLL. La string è normale, non static. Per capirci faccio un esempio con la funzione f() che, per comodità non riceve parametri e restituisce sempre la stessa stringa:
//da qualche parte nella DLL...
string f()
{
string r = "facciamo finta di aver fatto calcoli spettacolari che ora sono riassunti in questa stringa";
return r; //l'oggetto, non un puntatore
}
//da qualche altra parte nella DLL...
string var_risultato_f = f(); // la variabile risultato è sempre assegnata correttamente!!
//var_risultato_f viene eventualmente modificata e restituita al programma che chiama la DLL.
La funzione funziona, usata migliaia, forse milioni di volte. La stringa restituita da f() è sempre quello che ci si aspetta.
Domanda da un milione di dollari, la funzione è pericolosa? Cioè può capitare che un giorno restituirà un valore errato?
Sul suo funzionamento corretto, le possibili spiegazioni che mi sono venute in mente:
1. il caso che la chiamata a f() restituisca un riferimento ad un oggetto non valido è possibile ma mooolto poco probabile. Segue che bisognerebbe comunque modificarla per evitare rischi inutili (quale è il modo migliore?);
2. il fatto che la funzione sia in una DLL crea le condizioni in memoria affinché la chiamata ad f() sia sempre sicura (diverso se fosse in un .exe);
3. questo tipo di chiamata è sicuro in ogni caso (almeno in C++), chi mi ha detto che non è corretto si è sbagliato. Posso dormire sonni tranquilli;
4. dipende dal compilatore (?!)
altre idee?