2011-01-21 36 views
5

Đối với boost::weak_ptr các operator< được xác định, để nó có thể được sử dụng trong các thùng chứa kết hợp.thứ tự sắp xếp tăng :: weak_ptr sau khi hết hạn?

Câu hỏi của tôi là: Thứ tự sắp xếp của một số đối tượng weak_ptr có ổn định ngay cả khi một số đối tượng chuyển sang số không? Điều đó có gây rối với các thùng chứa như std::set không?

Ví dụ:

using namespace boost; 
shared_ptr<A> sptrA1(new A); 
weak_ptr<A> wptrA1 = sptrA1; 
weak_ptr<A> wptrA2; 

{ // begin Scope 1 
    shared_ptr<A> sptrA2(new A); 
    wptrA2 = sptrA2; 
    assert(wptrA1 < wptrA2); // assert #1 
} 
assert(wptrA1 < wptrA2); // assert #2 
  • sẽ khẳng định # 2 luôn đúng nếu khẳng định # 1 là đúng?
  • Có phải wptrA2 ở cùng một tiểu bang trước và sau Phạm vi 1 không?

Trả lời

5

Trong triển khai hiện tại boost::weak_ptr, operator< so sánh con trỏ với cấu trúc theo dõi số lượng tham chiếu nội bộ. Cấu trúc này không được giải phóng cho đến khi tất cả các tham chiếu và yếu yếu được xóa, vì vậy vẫn an toàn khi sử dụng operator< ngay cả khi dữ liệu người dùng được giải phóng do thiếu tham chiếu mạnh.

+0

Thú vị. Tôi đã bị nhầm lẫn bởi các tài liệu của use_count trong http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm. Nó tuyên bố "Returns: 0 if * this is empty" tuy nhiên theo câu trả lời của bạn ngược lại (* điều này là trống nếu nó trả về 0) là không đúng, phải không? (Nếu trống được định nghĩa là trạng thái thu được từ mặc định xây dựng một weak_ptr.) –

+0

Tôi chưa thực hiện bất kỳ câu lệnh nào về 'use_count' nào ở đây :) Điều đó nói rằng, cấu trúc đếm tham chiếu nội bộ giữ hai số đếm - một cho chỉ tham chiếu mạnh mẽ (khi nó chạm 0, đối tượng chỉ định bị phá hủy) và một đối tượng bao gồm cả tham chiếu mạnh và yếu (khi nó chạm 0, cấu trúc đếm tham chiếu bị hủy). Hàm 'use_count' có thể đang nhìn vào cái chỉ có số đếm mạnh, nhưng tôi chưa từng điều tra, vì vậy hãy tự kiểm tra. :) – bdonlan

2

Đọc về so sánh weak_ptr here.

+0

Thú vị đọc. Không hẳn là một vấn đề tầm thường. –

1

Sử dụng tiêu chuẩn :: owner_less. Điều này so sánh con trỏ của số lượng sử dụng, không phải con trỏ. Ví dụ:

typedef std::weak_ptr<int> IntWPtr; 
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set; 
+0

thú vị, tuy nhiên đây là một tính năng C++ 11 mà tôi không thể sử dụng tại thời điểm này. –

Các vấn đề liên quan