2012-07-24 37 views
9

Tôi có một cấu trúc:Đúc shared_ptr <T> để shared_ptr <void>

struct Params { 
    std::shared_ptr<void> user_data; 
    /* ... */ 
}; 

Tôi muốn sử dụng nó như thế này:

int main() { 
    std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100)); 
    Params params; 
    /* ... */ 
    params.user_data = std::static_pointer_cast<void>(sp); 
    /* ... */ 
    std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
     params.user_data 
    ); 
    /* ... */ 
    return 0; 
} 

Đây có phải là hợp lệ và an toàn không?

+0

Thông số trong khối chính là gì? –

+0

Bạn không thể 'xóa' một con trỏ trống, vì vậy mã của bạn không được biên dịch. –

+2

@KerrekSB chia sẻ con trỏ để vô hiệu hóa chắc chắn là hợp lệ. Xem ở đây để biết thêm chi tiết: http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work –

Trả lời

7

Mã, thực tế xóa đối tượng được chia sẻ được xác định khi con trỏ chia sẻ được tạo (đó là lý do bạn cần loại hoàn chỉnh, khi xây dựng shared_ptr và không, khi hủy shared_ptr). Vì vậy, ngay cả khi shared_ptr của bạn là con trỏ cuối cùng trỏ đến đối tượng SpecializedParams của bạn, đối tượng sẽ bị phá hủy một cách chính xác.

3

Điều này sẽ an toàn vì mục được bỏ trống cũng là shared_ptr. Nó sẽ thêm một tham chiếu đến phần tử hiện có và nó sẽ không được giải phóng cho đến khi mục được bỏ đi bị mất đi.

+2

Lý do nó hoạt động là do hàm deleter ẩn được lưu trữ với đối tượng 'shared_ptr ' ... Nếu không, chỉ cần gọi 'delete' trên con trỏ' void' sẽ không giải quyết chính xác tài nguyên bộ nhớ của đối tượng đang được quản lý bởi ' shared_ptr '. – Jason

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