2012-05-27 25 views
20

tôi đã làm việc trên một dự án nhỏ và đến một tình huống mà những điều sau đây xảy ra:Gán một nullptr cho chuỗi std :: an toàn?

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

Câu hỏi của tôi là nếu GetValue() trả về NULL myString trở thành một chuỗi rỗng? Nó không xác định? hoặc nó sẽ segfault?

+1

Câu hỏi này khá giống: http://stackoverflow.com/questions/2407711/avoiding-improper-stdstring-initialization-with-null-const-char-using-g – chris

+2

Microsoft luôn có lỗi khi chỉ định 0x0 để std :: string là OK. Bằng cách nhìn vào mã của bạn có vẻ như bạn là một anh chàng microsoft, vì vậy nó có thể làm việc cho bạn. Nhưng .. nếu không nó sẽ kích hoạt một SIGSEGV. –

Trả lời

38

Câu hỏi nhỏ thú vị. Theo tiêu chuẩn C++ 11, giáo phái. 21.4.2.9,

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

Yêu cầu: s không được là con trỏ rỗng.

Vì tiêu chuẩn không yêu cầu thư viện ném một ngoại lệ khi yêu cầu cụ thể này không được đáp ứng, có vẻ như việc truyền con trỏ rỗng đã kích hoạt hành vi không xác định.

9

Đó là lỗi thời gian chạy.

Bạn nên làm điều này:

myString = ValueOrEmpty(myObject.GetValue()); 

nơi ValueOrEmpty được định nghĩa là:

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

Hoặc bạn có thể trở lại const char* (nó làm cho cảm giác tốt hơn):

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

Nếu bạn trả lại const char*, sau đó tại trang web gọi, nó sẽ chuyển đổi thành std::string.

4

Câu hỏi của tôi là nếu GetValue() trả về NULL myString trở thành một chuỗi rỗng? Nó không xác định? hoặc nó sẽ segfault?

Hành vi không xác định. Trình biên dịch và thời gian chạy có thể làm bất cứ điều gì nó muốn và vẫn tuân thủ.

Các vấn đề liên quan