2014-12-04 15 views
7

Nói chung làm các con trỏ thông minh như std::unique_ptrGlib::RefPtr xóa đối tượng của chúng khi được gán lại để trỏ vào đối tượng khác, vì chúng là con trỏ duy nhất giữ đối tượng đã cho (rõ ràng ngụ ý trong trường hợp std::unique_ptr)?Chỉ định lại các con trỏ thông minh

Trả lời

9

Đối unique_ptr::reset, [unique.ptr.single.modifiers]/4:

Hiệu ứng: gán p để con trỏ lưu trữ, và sau đó nếu giá trị cũ của con trỏ lưu trữ, old_p, không bằng nullptr, gọi get_deleter()(old_p).

Hoặc toán tử gán di chuyển, operator=(unique_ptr&& u) trong [unique.ptr.single.asgn]/2:

Chuyển quyền sở hữu u-*this như thể bằng cách gọi reset(u.release()) Tiếp theo get_deleter() = std::forward<D>(u.get_deleter()).

(tương đương cho mẫu tử gán khác)


Đối shared_ptr, phân công lại là một chút khác nhau. shared_ptr sẽ không bao giờ phá hủy một đối tượng được tham chiếu khi nó không phải là đối tượng còn lại cuối cùng sở hữu nó, vì vậy hãy giả sử rằng nó được đưa ra.
shared_ptr::reset(Y*) quy định cụ thể trong [util.smartptr.shared.mod]/3:

Hiệu ứng: Tương đương với shared_ptr(p).swap(*this).

Nhưng rõ ràng tạm thời bị hủy khi kết thúc cuộc gọi hàm, hủy đối tượng giữ (nếu có).
Đó là cùng một hành vi operator=(shared_ptr<> const&) có, [util.smartptr.shared.assign]/1 và 4:

Hiệu ứng: Tương đương với shared_ptr(r).swap(*this).

... toán tử gán di chuyển (mẫu), rshared_ptr<>&&:

Hiệu ứng: Tương đương với shared_ptr(std::move(r)).swap(*this).

Nếu *this là chủ sở hữu cuối cùng, thì hiện tại tạm thời - sẽ bị hủy bên trong.


Đối Glib::RefPtr kịch bản tương tự như shared_ptr: Toán tử gán bản sao (và một toán tử gán template) được định nghĩa với ngữ nghĩa tương tự.Nếu hiện tại RefPtr được gán cho một cái gì đó khác, bộ đếm tham chiếu đối tượng đang giữ đang bị giảm và bị hủy nếu giá trị bộ đếm kết quả bằng không.

+0

RefPtr something = getSomething(); something = getSomethingElse(); hoạt động tốt. Bạn không cần sử dụng RefPtr :: swap(). Tất nhiên việc phân công lại ở đây chỉ làm giảm tham chiếu trên Cái gì đó đầu tiên thay vì xóa nó. Đó là một con trỏ thông minh _shared_ đếm tham chiếu. – murrayc

+0

@murrayc Tôi phải đọc sai tài liệu lần đầu tiên tôi xem qua. Cảm ơn! – Columbo

3

Đối unique_ptr câu trả lời là có:

Đối tượng bị phá hủy và bộ nhớ của nó deallocated khi một trong hai sau xảy ra s:

  • unique_ptr quản lý các đối tượng bị phá hủy
  • unique_ptr quản lý đối tượng được gán một con trỏ khác qua toán tử = hoặc reset().

Đối tượng bị hủy bằng cách sử dụng nhà cung cấp có khả năng do người dùng cung cấp bởi gọi Deleter (ptr). Các deleter gọi destructor của đối tượng và phân phát bộ nhớ.

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