2013-04-17 35 views
37

Với tình huống chung mà tuổi thọ của một đối tượng sở hữu được liên kết với chủ sở hữu của nó, tôi có thể sử dụng một con trỏ duy nhất theo một trong 2 cách. .Tôi có nên gán hoặc đặt lại unique_ptr không?

Nó có thể được gán:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned=std::unique_ptr<someObject>(new someObject());   
    } 
}; 

Phương pháp khôi phục có thể được sử dụng:

class owner 
{ 
    std::unique_ptr<someObject> owned;  
public: 
    owner() 
    { 
     owned.reset(new someObject()); 
    } 
}; 

Trong lợi ích của thực hành tốt nhất, tôi nên thích một hình thức khác không?

EDIT: Xin lỗi các bạn. Tôi đã đơn giản hóa điều này. Việc phân bổ đống xảy ra trong một phương thức khởi tạo và không phải trong ctor. Vì vậy, tôi không thể sử dụng danh sách khởi tạo.

Trả lời

27

Từ the docs of unique_ptr's operator=:

Chuyển quyền sở hữu của đối tượng được trỏ đến bởi r để * như thế này nếu bằng cách gọi reset(r.release()) tiếp theo là một nhiệm vụ từ std::forward<E>(r.get_deleter()).

Và tất cả các bạn cần đó là reset cuộc gọi, do đó, nó đơn giản chỉ gọi nó là trực tiếp

+26

Tôi biết đã muộn nhưng chỉ dành cho người đọc trong tương lai. Theo Scott Meyers trong cuốn sách Modern Modern C++, std :: make_unique là thích hợp hơn, vì nó cung cấp sự an toàn ngoại lệ: owner = std :: make_unique (). Vấn đề là std :: make_unique là một phần của C++ 14 (không phải C++ 11), nhưng ở đây bạn có thể tìm thấy [ở đây] (https://isocpp.org/files/papers/N3656.txt) một thực hiện tốt mà bạn có thể sao chép-dán. –

15

Cách thích hợp để làm điều này (mà bạn không list) là sử dụng các nhà xây dựng của owned:

owner() : owned(new someObject()) 
{} 

Bên cạnh đó tôi muốn reset như bạn không tạo ra một trung gian vô ích ví dụ trong trường hợp đó (mặc dù có thể không có sự khác biệt về cấp độ máy vì trình tối ưu hóa có thể thực hiện rất nhiều ở đó).

+1

"Tôi muốn thiết lập lại như bạn không tạo một đối tượng trung gian vô ích" - mà được nó. Cảm ơn – learnvst

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