Saltar al contenido

Devuelve char* de la función

Te recomendamos que pruebes esta respuesta en un ambiente controlado antes de pasarlo a producción, saludos.

Solución:

En C++, el string el manejo es diferente de, por ejemplo, pascal.

char* mycharheap()

    char* ch = new char;
    ch = "Hello Heap";
    return ch;

Esto hace lo siguiente:

  1. char* ch = new char; crea memoria para UN carácter y lo asigna a la variable ch
  2. ch = "Hello Heap"; asigna a la variable ch puntero a la memoria de solo lectura, que contiene bytes "Hello Heap". Además, el contenido original de la variable ch se pierde, lo que provoca una fuga de memoria.
  3. return ch; devuelve el puntero almacenado en la variable ch.

Lo que probablemente querías es

char* mycharheap()

    char* ch = new char[11] /* 11 = len of Hello Heap + 1 char for */;
    strcpy(ch, "Hello Heap");
    return ch;

Nota la strcpy -> tienes memoria en chque tiene espacio para 11 caracteres, y lo estás llenando con string de la porción de memoria de sólo lectura.

Habrá una fuga en este caso. Deberá eliminar la memoria después de escribir, como:

char* tempFromHeap = mycharheap();
cout << "mycharheap() = " << tempFromHeap << endl;
delete[] tempFromHeap;

Sin embargo, yo altamente no recomiendo hacer esto (asignar memoria en la persona que llama y eliminar en la persona que llama). Para estas situaciones, existen, por ejemplo, STL std::stringotro enfoque común y más razonable es asignar en la persona que llama, pasar a la persona que llama, que 'llena' la memoria con el resultado, y desasignar en la persona que llama nuevamente.

Lo que resultará en un comportamiento indefinido es lo siguiente:

char* mycharstack()

    char[] ch = "Hello Heap"; /* this is a shortcut for char[11] ch; ch[0] = 'H', ch[1] = 'e', ...... */
    return ch;

Esto creará array en la pila con bytes "Hello Heap"y luego intenta devolver el puntero al primer byte de ese array (que puede, en la función de llamada, apuntar a cualquier cosa)

en mycharstack() el string se almacena en la pila, supongo, por lo que "ch" queda fuera del alcance, no debería poder devolver el string. ¿Cómo funciona correctamente?

UN string literal se refiere a un array que vive en static memoria. Espero que conozca las tres áreas de memoria: memoria automática (también conocida como pila), almacenamiento gratuito (también conocido como montón) y static memoria. Esa cosa en la pila es solo una variable de puntero y devuelve el valor del puntero (la dirección que almacena) por valor. Así que todo está bien excepto por el hecho de que deberías haber usado const char* como tipo de puntero porque no se le permite modificar el array un string literal se refiere.

supongo que el string almacenado en mychar() también está en la pila.

Él string (el personaje array) se almacena en static memoria. char* es solo un tipo de puntero que puede usar para pasar direcciones. const también falta

Supongo que hay otros errores en el código y pérdidas de memoria, por favor hágamelo saber si hay alguno.

La fuga está en su tercera función. Asigna memoria para un solo carácter en el montón y almacena su dirección en la variable llamada ch. Con la siguiente asignación, sobrescribe esta dirección con la dirección de un string literal. Entonces, estás perdiendo memoria.

Parece que estás pensando en char* como tipo para string variables Pero no lo es. Es el tipo de un puntero a un carácter o secuencia de caracteres. El puntero y el string podría señalar que son dos cosas separadas. Lo que probablemente deberías usar aquí es std::string en cambio.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *