Tôi có một dự án mà tôi muốn sử dụng nhiều con trỏ thông minh hơn. Nhìn chung, tôi đã thành công trong mục tiêu này. Tuy nhiên, tôi đã đi qua một trong những điều mà tôi không chắc chắn những gì "thực hành tốt nhất" là.trả về một 'con trỏ' được yêu cầu phải được giữ bởi một con trỏ thông minh
Về cơ bản tôi muốn trả về "con trỏ" từ một hàm, nhưng yêu cầu rằng người dùng giữ nó trong con trỏ thông minh. Không chỉ vậy, tôi không muốn ủy thác một con trỏ thông minh cụ thể (được chia sẻ so với scoped).
Vấn đề chủ yếu là dường như không có cách thích hợp để nâng cấp scoped_ptr
lên shared_ptr
(đó sẽ là giải pháp lý tưởng mà tôi nghĩ). Tôi hiểu tại sao họ không làm điều này, vì nó sẽ cho phép chuyển quyền sở hữu mà có thể dẫn đến một số vấn đề như những người std::auto_ptr
có.
Tuy nhiên, việc chuyển quyền sở hữu có vẻ là ý tưởng hay cho trường hợp này. Vì vậy, ý tưởng của tôi là như thế này:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
này hoạt động "ok" vì cả hai scoped_ptr
và shared_ptr
có nhà thầu đó mất quyền sở hữu từ một std::auto_ptr
.
Vì vậy, câu hỏi của tôi là, thực hành tốt này? Có giải pháp nào tốt hơn không? Các chỉ thay thế thực sự tôi đã có thể đưa ra là sử dụng một mẫu template như giá trị trả về như thế này:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
mà thực sự có thể làm việc tốt ngoại trừ việc tôi nghĩ rằng nó sẽ cần một số công việc để làm cho nó cũng làm việc với số scoped_ptr
.
Suy nghĩ?
shared_ptr trong chuỗi tạo đơn không sử dụng tính toán tham chiếu nguyên tử. –
Bạn nói đúng, nhưng theo mặc định, tăng được xây dựng trong phiên bản nhiều luồng. – Artyom
Lợi thế của việc sử dụng scoped_ptr trên auto_ptr là khi bạn muốn làm cho nó rõ ràng bạn không phải sao chép con trỏ. Bạn chỉ đơn giản là không thể với scoped_ptr. Đó là về truyền đạt ý định của bạn, giống như ví dụ của bạn với auto_ptr và chuyển quyền sở hữu. –