Cuando regresamos de la función, si el valor devuelto es un puntero, debe definirse como estático. ¿Es esto cierto para el puntero asignado a la memoria del montón (como los punteros new / malloc ) también?
considera este ejemplo:
#include"stdio.h" char * func() { char * X=new char[10]; X[0]='C'; x[1]='\0'; return X;//is it a good return from function? } main() { char * A=func(); puts(A); delete[] A; }Como ya han señalado otros, técnicamente, el código está bien.
Sin embargo, el verdadero problema con el código es la firma de la función char * func() . Solo especifica que devolverá un puntero a un char. Ese puntero puede ser
El puntero puede apuntar a
No hay forma de saber qué hacer a menos que desee confiar en la documentación o investigar posiblemente en una gran cantidad de código (funciones que llaman a funciones que llaman a funciones...).
Esto se puede evitar volviendo
La administración manual de la memoria es difícil de realizar correctamente dentro de una aplicación completa y nunca debe ser su principal preocupación, por lo que debe evitarse y no ocultarse mediante punteros de retorno de funciones.
Además del extraño cambio de incremento/decremento, el código está bien.
La variable X queda fuera del alcance cuando la función regresa, pero esa es solo la variable real y no a lo que apunta.
Los punteros son básicamente enteros simples, cuyo contenido resulta ser una dirección a algún lugar de la memoria, y el compilador los trata especialmente. Lo que sucede cuando la función regresa es que el contenido de la variable X se copia antes de que la variable quede fuera del alcance. Luego, la copia del contenido (la dirección de memoria real) se vuelve a copiar, esta vez a la variable A en la función de llamada.
C++ no se recolecta basura. X en func() no se desasigna hasta que se delete [] A declaración en main() .
Las travesuras con el incremento y la disminución de X no cambian eso (a menos que hagan que X apunte fuera de la memoria asignada con el operador new , lo que daría como resultado un comportamiento indefinido).