2010-08-07 40 views
11

Tôi đã đoạn mã sau:thử nghiệm nếu một shared_ptr là NULL

std::vector< boost::shared_ptr<Foo> >::iterator it; 
it = returnsAnIterator(); 
// often, it will point to a shared_ptr that is NULL, and I want to test for that 
if(*it) 
{ 
    // do stuff 
} 
else // do other stuff 

Tôi có thử nghiệm một cách chính xác? Các tài liệu tăng nói rằng một shared_ptr có thể được chuyển đổi hoàn toàn thành một bool, nhưng khi tôi chạy mã này nó segfaults:

Program received signal SIGSEGV, Segmentation fault. 
0x0806c252 in boost::shared_ptr<Foo>::operator Foo* 
boost::shared_ptr<Foo>::* (this=0x0) 
    at /usr/local/bin/boost_1_43_0/boost/smart_ptr/detail/operator_bool.hpp:47 
47    return px == 0? 0: &this_type::px; 

Trả lời

7

Có, bạn đang thử nghiệm nó một cách chính xác.

Vấn đề của bạn, tuy nhiên, có thể do dereferencing là trình lặp không hợp lệ. Kiểm tra xem returnsAnIterator() luôn trả về một trình lặp không phải là vector.end() và vectơ không được sửa đổi ở giữa hoặc trống.

+0

Trình lặp là 'vector.begin()', vì vậy dường như tôi đã thử nghiệm điều sai. Cảm ơn bạn đã giúp đỡ. – Max

8

Có, mã bạn có ở trên là chính xác. shared_ptr có thể được chuyển đổi hoàn toàn thành một bool để kiểm tra null-ness.

Sự cố bạn gặp phải là chức năng returnAnIterator() của bạn đang trả lại trình lặp không hợp lệ. Có thể nó đang trả lại end() cho một số vùng chứa, là một qua phần cuối của vùng chứa và do đó không thể bị hủy đăng ký như bạn đang thực hiện với *it.

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