2017-09-27 20 views
10

Hãy nói rằng tôi có một shared_ptr để một mảng:Gán một shared_ptr đến một bù đắp của một mảng

std::shared_ptr<int> sp(new T[10], [](T *p) { delete[] p; }); 

Và một phương pháp:

shared_ptr<T> ptr_at_offset(int offset) { 
    // I want to return a shared_ptr to (sp.get() + offset) here 
    // in a way that the reference count to sp is incremented... 
} 

Về cơ bản, những gì tôi đang cố gắng làm là trả về một số shared_ptr mới làm tăng số lượng tham chiếu, nhưng trỏ đến một offset của mảng ban đầu; Tôi muốn tránh có mảng bị xóa trong khi một người gọi đang sử dụng mảng tại một số bù đắp. Nếu tôi chỉ trả lại sp.get() + offset điều đó có thể xảy ra, phải không? Và tôi nghĩ rằng việc khởi tạo một shared_ptr mới để chứa sp.get() + offset cũng không có ý nghĩa.

Mới đối với C++, vì vậy, không chắc liệu tôi có đang tiếp cận chính xác điều này hay không.

+2

Tôi khuyên bạn nên sử dụng 'std :: array' thay vì mảng thô. Điều đó cho phép bạn sử dụng 'std :: make_shared' và tránh deleter tùy chỉnh:' auto p = std :: make_shared >(); std :: shared_ptr p2 {p, & p-> at (n)}; ' –

+0

Ah okay thuận tiện hơn yeah – ujvl

+1

Câu hỏi đó là một câu hỏi thực sự hay. Tôi chưa bao giờ gặp vấn đề trước đây nhưng tôi biết ơn vì tương lai. – ZeroUltimax

Trả lời

17

Bạn sẽ có thể sử dụng aliasing constructor:

template< class Y > 
shared_ptr(const shared_ptr<Y>& r, element_type* ptr) noexcept; 

này chia sẻ quyền sở hữu với shared_ptr nhất định, nhưng đảm bảo để làm sạch theo một mà, không phải là con trỏ bạn cho nó.

shared_ptr<T> ptr_at_offset(int offset) { 
    return {sp, sp.get() + offset}; 
} 
Các vấn đề liên quan