2011-03-16 16 views
11

¿Está lo seguro como está, sin una conversión explícita o llamada al constructor std :: string? Si no es seguro, ¿por qué no?Devolución de matriz como std: cadena

std:string myfunc() 
{ 
    char buf[128] = ""; 
    // put something into buf or not base on logic. 

    return buf; 
} 
+0

en realidad el título de la pregunta es incorrecto. Estás devolviendo la matriz de caracteres como std :: cadena. – Benoit

+0

Editado el título de la pregunta. –

Respuesta

9

Sí. Eso está perfectamente bien. La persona que llama obtendrá una copia del búfer local, porque std::string haría una copia profunda de este búfer local.

EDIT: Supongo que buf es una cadena con terminación nula.

+0

¡No es seguro a menos que buf definitivamente sea nulo terminado! – T33C

+0

@ T33C: Correcto. ¡Agregué esta suposición subyacente! – Nawaz

+0

Es una mala práctica de programación suponer cosas. Más bien, uno debería asegurarse de que el retorno sea seguro. El código en la pregunta no garantiza esto si buf se modifica posteriormente como sugiere el comentario. – T33C

4

Sí, eso está bien, recuerda en C++, lo que sucederá es que se llamará a un constructor implícito para crear el objeto de retorno, y una cadena se puede construir con una matriz de caracteres. En C++, debe devolver explícitamente por referencia si no desea que se cree una copia.

+0

¡No es seguro a menos que buf definitivamente sea nulo! – T33C

+1

es seguro, como se describe por @karlphillip a continuación, porque la declaración char buf [128] = ""; es una inicialización que establecerá buf para apuntar a una cadena vacía terminada nula, no está configurando un solo carácter en la matriz. – titania424

3

En realidad, es seguro. Pero eso es solo porque está inicializando el char array así, que es extremadamente importante. Considere el siguiente código:

#include <string.h> 
#include <iostream> 
#include <string> 

std::string alloc_string(bool fill) 
{ 
    char buf[128] = ""; // Proper declaration/initialization of the array. 

    if (fill) 
    { 
     strcpy(buf, "qwerty"); 
    } 

    return buf; 
} 

int main() 
{ 
    std::string empty_str = alloc_string(false); 
    std::cout << "empty_str size is: " << empty_str.size() << std::endl; 

    std::string str = alloc_string(true); 
    std::cout << "str size is: " << str.size() << std::endl; 
    std::cout << "str: " << str << std::endl; 
} 

Salidas:

empty_str size is: 0 
str size is: 6 
str: qwerty 
+1

Si olvida inicializar la matriz, seguramente romperá el código ya que podría haber basura en ese bloque de memoria. Pruébalo y probablemente notes que 'empty_str' ya no está vacío, aunque no hayas copiado nada. – karlphillip

0

segura (por nula tampón terminado) pero no es fácil de leer, considere cambiar la última línea para

return std::string(buf); 

Edición: por favor vea el karlphillip sobre seguridad.

Cuestiones relacionadas