2009-02-02 18 views
40

Tôi có một cái gì đó như shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) Tôi bây giờ cần gọi hàm theo kiểu C yêu cầu con trỏ đến Type. Làm thế nào để lấy nó từ shared_ptr?nhận ptr bình thường từ shared_ptr?

Trả lời

123

Sử dụng các phương pháp get():

boost::shared_ptr<foo> foo_ptr(new foo()); 
foo *raw_foo = foo_ptr.get(); 
c_library_function(raw_foo); 

Hãy chắc chắn rằng shared_ptr của bạn không đi ra khỏi phạm vi trước khi chức năng thư viện được thực hiện với nó - nếu không có thể dẫn đến badness, vì thư viện có thể cố gắng làm một cái gì đó với con trỏ sau khi nó đã bị xóa. Hãy đặc biệt cẩn thận nếu chức năng thư viện duy trì một bản sao của con trỏ thô sau khi nó trở về.

+0

bạn có lẽ nên lưu ý điều gì đó về shared_ptr sẽ nằm ngoài phạm vi trước khi c_library_function thực hiện điều đó với raw_foo. – falstro

+0

roe: tôi biết về điều đó, tôi chỉ cần biết về get :). Cảm ơn Adam! : D –

+1

Xin chào @Adam Rosenfield, bạn có thể giải thích những gì xảy ra trong một tình huống mà một ngoại lệ xảy ra bên trong 'c_library_function'. Điều đó có nghĩa là raw_foo bị treo lơ lửng? hoặc không foo_ptr đi trước và xóa raw_foo, vì raw_foo được tổ chức bởi foo_ptr? – thassan

27

Một cách khác để làm điều đó sẽ được sử dụng một sự kết hợp của các nhà khai thác &*:

boost::shared_ptr<foo> foo_ptr(new foo()); 
c_library_function(&*foo_ptr); 

Trong khi cá nhân tôi muốn sử dụng phương pháp get() (nó thực sự là câu trả lời đúng), một trong những lợi thế rằng điều này có nghĩa là nó có thể được sử dụng với các lớp khác quá tải operator* (con trỏ dereference), nhưng không cung cấp phương thức get(). Có thể hữu ích trong mẫu lớp chung, ví dụ.

+0

Tôi thích câu trả lời của bạn nhiều hơn một chút sau đó Adams, xin lỗi adam. –

+3

@ acidzombie24 - Tôi không chắc tại sao bạn thích điều này tốt hơn. Phương thức Get() tốt hơn để sử dụng trong khoảng 99% hoặc nhiều hơn các trường hợp. –

+0

Tôi đang sử dụng nhưng tôi vẫn thích câu trả lời này. chủ yếu là bc nó đề nghị cả phải làm gì và KHÔNG làm. –