Thỉnh thoảng tôi cần shared_ptr
trường hợp có dấu phân cách không có op, vì API mong đợi một trường hợp shared_ptr
mà nó muốn lưu trữ trong một thời gian giới hạn nhưng tôi được cung cấp một con trỏ thô mà tôi không được phép sở hữu trong một thời gian lớn hơn những gì tôi đang chạy.Có phải một bí danh rỗng shared_ptr là một lựa chọn tốt cho việc xóa bỏ shared_ptr không-op không?
Đối với trường hợp này, tôi đã được sử dụng một deleter không-op, chẳng hạn như [](const void *){}
, nhưng hôm nay tôi phát hiện ra rằng có một sự thay thế cho rằng, sử dụng (hoặc lạm dụng?) Các aliasing constructor của shared_ptr
:
void f(ExpectedClass *ec) {
std::shared_ptr<ExpectedClass> p(std::shared_ptr<void>(), ec);
assert(p.use_count() == 0 && p.get() != nullptr);
apiCall(p);
}
Câu hỏi của tôi là, cách tốt hơn để làm điều này là gì và tại sao? Các kỳ vọng hiệu suất có giống nhau không? Với một deleter không có op tôi mong đợi để trả một số chi phí cho việc lưu trữ các deleter và tham chiếu, mà không xuất hiện là trường hợp khi sử dụng hàm tạo aliasing với shared_ptr
rỗng.
Vâng, có một lưu ý đề cập đến sự kỳ quặc này trong [util.smartptr.shared.const]/16. IMHO nó là kinda hệ quả của thực tế là bạn có thể có một không có sản phẩm nào 'shared_ptr' lưu trữ null (' shared_ptr ((T *) nullptr) '). Có khả năng một chút khó hiểu, nhưng hợp lệ. Một vấn đề với cách sử dụng này là bản sao của 'p' không chia sẻ quyền sở hữu với nó, bởi vì cả hai đều không sở hữu bất cứ thứ gì. Điều đó có thể quan trọng đối với một số ứng dụng mong đợi để kiểm tra các đối tượng chia sẻ quyền sở hữu (thông qua 'owner_less') nhưng có lẽ không phải là vấn đề cho việc sử dụng bạn mô tả. –
@JonathanWakely cảm ơn ghi chú. Các lưu ý trước đó/15) confuses me. Tại sao người dùng phải đảm bảo rằng 'p' vẫn hợp lệ cho đến khi nhóm quyền sở hữu' r' bị hủy trong 'shared_ptr <> (r, p)'? Tôi nghĩ đó là việc kinh doanh của 'shared_ptr'. Nếu tôi chỉ lưu trữ nó đi, con trỏ bí danh sẽ luôn hợp lệ vì nó ngăn chặn nhóm quyền sở hữu 'r' khỏi bị phá hủy, để người dùng có thể" sao chép và quên "về nó, hoặc tôi thiếu cái gì đó? –
Ah tôi hiểu ý nghĩa của nó. Trong trường hợp thời gian tồn tại của 'p' không bị ràng buộc với thời gian tồn tại của' r' (được cho phép), thì sự sống của 'r' không ngụ ý sự sống của' p' và sau đó người dùng phải đảm bảo điều đó. –