boost::shared_ptr
có một nhà xây dựng bất thườngshared_ptr của boost là gì (shared_ptr <Y> const & r, T * p) được sử dụng cho?
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
và tôi là một chút bối rối như những gì này sẽ hữu ích cho. Về cơ bản, nó chia sẻ quyền sở hữu với r
, nhưng .get()
sẽ trả lại p
. không phảir.get()
!
Điều này có nghĩa bạn có thể làm một cái gì đó như thế này:
int main() {
boost::shared_ptr<int> x(new int);
boost::shared_ptr<int> y(x, new int);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
Và bạn sẽ có được điều này:
0x8c66008
0x8c66030
2
2
Lưu ý rằng con trỏ là riêng biệt, nhưng cả hai đều khẳng định có một use_count
của 2 (kể từ khi họ chia sẻ quyền sở hữu của cùng một đối tượng).
Vì vậy, int
thuộc sở hữu của x
sẽ tồn tại càng lâu càng x
hayy
là xung quanh. Và nếu tôi hiểu các tài liệu chính xác, thì int
thứ hai sẽ không bao giờ bị hủy. Tôi đã xác nhận điều này với các chương trình thử nghiệm sau đây:
struct T {
T() { std::cout << "T()" << std::endl; }
~T() { std::cout << "~T()" << std::endl; }
};
int main() {
boost::shared_ptr<T> x(new T);
boost::shared_ptr<T> y(x, new T);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
đầu ra này (như dự kiến):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
... Vì vậy, tính hữu ích của cấu trúc bất thường này mà chia sẻ quyền sở hữu của một con trỏ là gì , nhưng hành vi giống như một con trỏ khác (mà nó không sở hữu) khi được sử dụng.
Câu hỏi hay. +1 – GManNickG
TL; DR phiên bản: Nó tạo ra một con trỏ đến một đối tượng phụ của 'r'. –