2012-05-27 13 views
20

pracowałem na niewielkim projektu doszło do sytuacji, w której dodaje się stało:Przypisanie wartości nullptr do std :: string jest bezpieczne?

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

Moje pytanie brzmi, czy GetValue() zwraca NULL myString staje się pusty ciąg? Czy to nie jest zdefiniowane? czy to będzie segfault?

+1

To pytanie jest bardzo podobne: http://stackoverflow.com/questions/2407711/avoiding-improper-stdstring-initialization-w-null-const-char-using-g – chris

+2

Firma Microsoft zawsze miała błąd przy przypisywaniu 0x0 na std :: string było w porządku. Patrząc na twój kod, wygląda na to, że jesteś gościem Microsoftu, więc to może ci pomóc. Ale ... w przeciwnym razie wywołałoby SIGSEGV. –

Odpowiedz

38

Interesujące małe pytanie. Zgodnie ze standardem C++ 11 sect. 21.4.2.9,

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

Wymaga: s nie może być null pointer.

Ponieważ standard nie prosi biblioteki, aby wyrzuciła wyjątek, gdy to szczególne wymaganie nie zostanie spełnione, wydaje się, że podanie wskaźnika zerowego spowodowało niezdefiniowane zachowanie.

9

Jest to błąd środowiska wykonawczego.

Należy to zrobić:

myString = ValueOrEmpty(myObject.GetValue()); 

gdzie ValueOrEmpty jest zdefiniowany jako:

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

Albo można powrócić const char* (to sprawia, że ​​lepiej sens):

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

Jeśli wróć na numer const char*, a następnie na stronie wywołania zmieni się w std::string.

4

Moje pytanie brzmi, czy GetValue() zwraca NULL myString staje się pusty ciąg znaków? Czy to nie jest zdefiniowane? czy to będzie segfault?

To niezdefiniowane zachowanie. Kompilator i czas pracy mogą robić, co chcą i nadal są zgodne.

Powiązane problemy