Tôi đã viết một phương thức nhà máy tĩnh trả về một đối tượng Foobar mới được điền từ một đối tượng dữ liệu khác. Gần đây tôi đã bị ám ảnh bởi ngữ nghĩa quyền sở hữu và tôi tự hỏi liệu tôi có đang truyền đạt thông điệp đúng hay không bằng cách phương thức này trả lại một unique_ptr
.Thực hành không tốt để trả về unique_ptr cho con trỏ thô như ngữ nghĩa quyền sở hữu?
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
Mục đích của tôi là cho mã khách hàng biết rằng họ sở hữu con trỏ. Không có con trỏ thông minh, tôi chỉ đơn giản trả về Foobar*
. Tuy nhiên, tôi muốn thực thi bộ nhớ này bị xóa để tránh các lỗi tiềm ẩn, do đó, unique_ptr
có vẻ như là một giải pháp thích hợp. Nếu khách hàng muốn kéo dài tuổi thọ của con trỏ, họ chỉ cần gọi .release()
sau khi họ nhận được unique_ptr
.
Foobar* myFoo = Foobar::factory(data).release();
Câu hỏi của tôi có hai phần:
- Liệu phương pháp này truyền đạt ngữ nghĩa sở hữu có đúng không?
- Đây có phải là "thực hành không tốt" để trả lại
unique_ptr
thay vì một con trỏ thô không?
Bạn đang quay trở lại unqiue_ptr để nói với khách hàng rằng họ sở hữu con trỏ? Điều này hoàn toàn trái ngược với những gì tôi mong đợi (vì họ phải nắm rõ quyền sở hữu con trỏ duy nhất). – jknupp
Thay vào đó, bạn có thể muốn sử dụng ngữ nghĩa di chuyển (nếu bạn có thể sử dụng C++ 11). Với điều này, người dùng có thể quyết định cách kéo dài tuổi thọ của đối tượng được tạo bởi nhà máy. – evnu
@evnu đó là điều gì đó được thực hiện tự động cho bạn, phải không? –