C ++ là tất cả về quyền sở hữu bộ nhớ - hay còn gọi là ngữ nghĩa quyền sở hữu .
Chủ sở hữu của một phần bộ nhớ được cấp phát động có trách nhiệm giải phóng bộ nhớ đó. Vì vậy, câu hỏi thực sự trở thành ai sở hữu bộ nhớ.
Trong C ++, quyền sở hữu được ghi lại bằng kiểu một con trỏ thô được bao bọc bên trong, do đó trong một chương trình C ++ tốt (IMO), rất hiếm ( hiếm , không phải không bao giờ ) thấy các con trỏ thô được chuyển xung quanh (vì con trỏ thô không có quyền sở hữu suy ra nên chúng ta có thể không cho biết ai sở hữu bộ nhớ và do đó nếu không đọc kỹ tài liệu, bạn không thể biết ai chịu trách nhiệm về quyền sở hữu).
Ngược lại, hiếm khi thấy các con trỏ thô được lưu trữ trong một lớp, mỗi con trỏ thô được lưu trữ trong trình bao bọc con trỏ thông minh của chính nó. ( NB: Nếu bạn không sở hữu một đối tượng, bạn không nên lưu trữ nó vì bạn không thể biết khi nào nó sẽ vượt ra khỏi phạm vi và bị phá hủy.)
Vì vậy, câu hỏi:
- Mọi người đã xem qua loại ngữ nghĩa sở hữu nào?
- Những lớp tiêu chuẩn nào được sử dụng để triển khai các ngữ nghĩa đó?
- Bạn thấy chúng hữu ích trong những tình huống nào?
Cho phép giữ 1 loại quyền sở hữu ngữ nghĩa cho mỗi câu trả lời để chúng có thể được bình chọn lên và xuống riêng lẻ.
Tóm lược:
Về mặt khái niệm, con trỏ thông minh rất đơn giản và việc triển khai đơn giản cũng dễ dàng. Tôi đã thấy nhiều cố gắng triển khai, nhưng luôn luôn bị hỏng theo một cách nào đó mà không rõ ràng đối với các ví dụ và sử dụng thông thường. Vì vậy, tôi khuyên bạn nên luôn sử dụng các con trỏ thông minh đã được kiểm nghiệm tốt từ thư viện hơn là sử dụng con trỏ của riêng bạn. std::auto_ptr
hoặc một trong những con trỏ thông minh Boost dường như đáp ứng mọi nhu cầu của tôi.
std::auto_ptr<T>
:
Người độc thân sở hữu đối tượng. Được phép chuyển quyền sở hữu.
Cách sử dụng: Điều này cho phép bạn xác định các giao diện thể hiện sự chuyển giao quyền sở hữu rõ ràng.
boost::scoped_ptr<T>
Người độc thân sở hữu đối tượng. KHÔNG được phép chuyển quyền sở hữu.
Cách sử dụng: Được sử dụng để thể hiện quyền sở hữu rõ ràng. Đối tượng sẽ bị phá hủy bởi hàm hủy hoặc khi đặt lại rõ ràng.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Nhiều quyền sở hữu. Đây là một con trỏ đếm tham chiếu đơn giản. Khi số lượng tham chiếu bằng không, đối tượng bị phá hủy.
Cách sử dụng: Khi một đối tượng có thể có nhiều chủ sở hữu với thời gian tồn tại mà không thể xác định tại thời điểm biên dịch.
boost::weak_ptr<T>
:
Được sử dụng shared_ptr<T>
trong các tình huống có thể xảy ra một chu kỳ con trỏ.
Cách sử dụng: Được sử dụng để dừng các chu kỳ giữ lại các đối tượng khi chỉ có chu kỳ đang duy trì một số tiền được chia sẻ.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Điều này có thể được diễn đạt lại không? Tôi không hiểu nó chút nào.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. Con trỏ RAW không có ngữ nghĩa quyền sở hữu. Nếu bạn không biết chủ sở hữu, bạn cũng không biết ai chịu trách nhiệm xóa đối tượng. Có một số lớp tiêu chuẩn được sử dụng để bọc con trỏ (std :: shared_ptr, std :: unique_ptr, v.v.) xác định quyền sở hữu và do đó xác định ai chịu trách nhiệm xóa con trỏ.