delete this
không hợp lệ trong trình phá hủy. Nó có thể được sử dụng ở nơi khác. Nhưng nó hiếm khi là một ý tưởng hay. Khung công tác wxWidgets
sử dụng nó cho lớp chuỗi của chúng. Nó có một chế độ trong đó, khi luồng kết thúc thực hiện, nó sẽ tự động giải phóng tài nguyên hệ thống và chính nó (đối tượng wxThread). Tôi thấy nó rất khó chịu, bởi vì từ bên ngoài, bạn không thể biết liệu nó có hợp lệ để tham khảo hay không - bạn không thể gọi một hàm như IsValid
nữa, bởi vì đối tượng không tồn tại. Điều đó có mùi giống như vấn đề chính với delete this
, ngoài vấn đề là nó không thể được sử dụng cho các đối tượng không động.
Nếu bạn làm điều đó, hãy đảm bảo bạn không chạm vào bất kỳ thành viên dữ liệu nào hoặc gọi bất kỳ chức năng thành viên nào nữa trên đối tượng bạn đã xóa theo cách đó. Tốt nhất làm điều đó như là câu lệnh cuối cùng trong một hàm không phải ảo, được bảo vệ hoặc riêng tư. Gọi xóa là hợp lệ trong một chức năng ảo và/hoặc công cộng quá, nhưng tôi sẽ hạn chế khả năng hiển thị của phương pháp làm điều đó.
C++ FAQ có mục nhập về điều đó. Trích dẫn C++ Standard trên xác nhận quyền sở hữu của tôi ở trên (3.8p5
):
Trước khi lưu trữ đối tượng đã được cấp phát hoặc sau khi hết thời gian của đối tượng đã kết thúc và trước lưu trữ mà đối tượng bị chiếm đóng được tái sử dụng hoặc phát hành, bất kỳ con trỏ nào đề cập đến vị trí lưu trữ nơi đối tượng sẽ được định vị hoặc được định vị có thể được sử dụng nhưng chỉ theo những cách hạn chế. [...] Nếu đối tượng sẽ là hoặc thuộc loại lớp với trình phá hủy không tầm thường và con trỏ được sử dụng làm toán hạng của biểu thức xóa, chương trình có hành vi không xác định.
Thời gian kết thúc khi trình phá hủy của đối tượng bắt đầu thực thi. Lưu ý có những ngoại lệ đối với các quy tắc đến sau đoạn đó đối với các đối tượng đang được xây dựng và phá hủy (ví dụ bạn được phép truy cập các thành viên dữ liệu không tĩnh), chi tiết tại 12.7
.
Nguồn
2009-01-15 16:44:55
Trong khi tự xóa đối tượng được đếm lại là một mẫu rất phổ biến, tôi nghĩ câu hỏi ban đầu là đặt nó vào một hàm hủy, chứ không phải hàm Release(), trong trường hợp đó nó chỉ là điên. – rmeador
@rmeador, Có hai câu hỏi thực sự. Cả hai tiêu đề và câu cuối cùng đề nghị muốn biết sử dụng hợp lệ của "xóa này;". Tôi hy vọng tôi đã trả lời điều đó. Giữa không đề xuất một câu hỏi "tại sao xóa điều này trong một dtor". Tôi đồng ý làm như vậy có vẻ điên rồ. – JaredPar
Mã mẫu của bạn có lỗi. Nếu _refCount là biến thành viên, khi bạn "xóa" biến thành viên đó không còn tồn tại, do đó, dòng "return _refCount" của bạn có hành vi không xác định. – ChrisN