Tôi có một chức năng mà tạo ra một unique_ptr với một deleter tùy chỉnh và trả về nó:Di chuyển unique_ptr với deleter tùy chỉnh cho một shared_ptr
auto give_unique_ptr() {
auto deleter = [](int* pi) {
delete pi;
};
int* i = new int{1234};
return std::unique_ptr<int, decltype(deleter)>(i, deleter);
}
Trong mã khách hàng của chức năng đó, tôi muốn di chuyển unique_ptr
vào một shared_ptr
, nhưng tôi không biết làm thế nào để làm điều đó cho rằng tôi không biết decltype của deleter tùy chỉnh của tôi bên ngoài của chức năng.
Tôi đoán nó sẽ giống như thế này:
auto uniquePtr = give_unique_ptr();
auto sharedPtr = std::shared_ptr<..??..>(std::move(uniquePtr));
gì làm tôi phải viết thay vì .. ?? .. để có được đúng loại?
Nếu điều này là có thể, sẽ shared_ptr
hoạt động tốt và gọi trình chỉnh sửa tùy chỉnh của tôi được tạo bên trong hàm give_unique_ptr()
khi số lượng sử dụng của nó đạt đến 0?
Hãy nhớ rằng 'shared_ptr' * erases * deleter. Thông số mẫu duy nhất là loại được trỏ đến trong chế độ xem hiện tại. – o11c
@ o11c điều đó có nghĩa là gì? Tôi đã thử giải pháp được đề xuất bởi @Nawaz và deleter được gọi sau khi 'shared_ptr' bị hủy. – j00hi
nó có nghĩa là loại của deleter không liên quan đến kiểu 'shared_ptr'. Bạn thậm chí có thể truyền tới, ví dụ: 'shared_ptr 'và nó vẫn sẽ gọi là deleter gốc. –
o11c