2012-05-27 16 views
20

yo estaba trabajando en un pequeño proyecto y llegó a una situación en la que ocurrió lo siguiente:Asignar un nullptr a std :: string ¿es seguro?

std::string myString; 
#GetValue() returns a char* 
myString = myObject.GetValue(); 

Mi pregunta es si GetValue() devuelve NULL myString se convierte en una cadena vacía? ¿Está indefinido? o se segfault?

+1

Esta pregunta es bastante similar: http://stackoverflow.com/questions/2407711/avoiding-improper-stdstring-initialization-with-null-const-char-using-g – chris

+2

Microsoft siempre tuvo un error al asignar un 0x0 std :: string estaba bien. Al mirar tu código, parece que eres un chico de Microsoft, por lo que podría funcionar para ti. Pero ... de lo contrario, desencadenaría un SIGSEGV. –

Respuesta

38

Interesante pregunta. De acuerdo con el estándar C++ 11, secc. 21.4.2.9,

basic_string(const charT* s, const Allocator& a = Allocator()); 

requiere: s no será un puntero nulo.

Como la norma no pide a la biblioteca que emita una excepción cuando no se cumple este requisito en particular, parecería que pasar un puntero nulo provoca un comportamiento indefinido.

9

Es un error de tiempo de ejecución.

Usted debe hacer esto:

myString = ValueOrEmpty(myObject.GetValue()); 

donde ValueOrEmpty se define como:

std::string ValueOrEmpty(const char* s) 
{ 
    return s == nullptr ? std::string() : s; 
} 

O bien, podría volver const char* (que tiene más sentido):

const char* ValueOrEmpty(const char* s) 
{ 
    return s == nullptr ? "" : s; 
} 

Si devuelva const char*, luego en el sitio de llamada, se convertirá en std::string.

4

Mi pregunta es si GetValue() devuelve NULL myString se convierte en una cadena vacía? ¿Está indefinido? o se segfault?

Comportamiento indefinido. El compilador y el tiempo de ejecución pueden hacer lo que quieran y seguir cumpliendo.

Cuestiones relacionadas