2015-07-23 16 views
5

Tôi có một lớp có phương thức setter lấy một đối số unique_ptr. Đó unique_ptr được lưu như là một thành viên lớp.Làm thế nào để tiêu diệt một con trỏ thông minh sớm

class TestClass { 
    std::unique_ptr<Tester> sp; 

    void setTester_Way1(std::unique_ptr<Tester> te) { 
     auto deleter=std::move(sp); 
     sp=std::move(te); 
    } 

    void setTester_Way2(std::unique_ptr<Tester> te) { 
     sp=std::move(te); 
    } 
}; 

Cách nào là đúng để đặt con trỏ thông minh? Way2 có bị rò rỉ con trỏ ban đầu của sp không?

+4

Chỉ có một cách để rò rỉ một 'unique_ptr': hàm thành viên' release() ' – emlai

+1

Tôi nghĩ câu trả lời này giải thích mọi thứ http://stackoverflow.com/questions/8114276/how-do-i-pass-a -unique-ptr-argument-to-a-constructor-or-a-function – vim

+0

@zenith là một thách thức? – Yakk

Trả lời

6

Cách 2 là tốt, khi bạn gán cho unique_ptr bất kỳ con trỏ nào hiện có thuộc sở hữu sẽ bị xóa an toàn.

2

Như Chris Drew nói Way2 là tốt. Một điều mặc dù là unique_ptr không thể sao chép/gán được vì vậy cách duy nhất để vượt qua một unique_ptr là tham chiếu, tham chiếu giá trị r hoặc theo giá trị với move(). Đang cố gắng làm:

int main() 
{ 
    TestClass t; 
    auto p = std::make_unique<int>(10); 
    t.setTester_Way2(p); 
} 

Will fail to compile. Mặc dù bạn có thể move()p vào chức năng (example).

Nếu bạn thay đổi setTester_Way2() thành void setTester_Way2(std::unique_ptr<int>& te)then it will compile. Nếu bạn thay đổi chức năng để có một tài liệu tham khảo rvalue và std::move() con trỏ vào funcnction:

class TestClass { 
    std::unique_ptr<int> sp; 
public: 

    void setTester_Way1(std::unique_ptr<int> te) { 
     auto deleter=std::move(sp); 
     sp=std::move(te); 
    } 

    void setTester_Way2(std::unique_ptr<int>&& te) { 
     sp=std::move(te); 
    } 
}; 

int main() 
{ 
    TestClass t; 
    auto p = std::make_unique<int>(10); 
    t.setTester_Way2(std::move(p)); 
} 

Then it will also compile.

+2

Bạn có đề xuất họ nên đi qua tham chiếu thay thế không? Bởi vì tôi nghĩ rằng giá trị vượt qua [là tốt] (http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/) trong trường hợp này. –

+0

@ChrisDrew Cá nhân tôi thích bằng tham chiếu giá trị r vì nó làm rõ rằng bạn sẽ di chuyển nó. Trừ khi tôi vẫn còn căn cứ vào ngữ nghĩa di chuyển. – NathanOliver

+5

truyền bằng tham chiếu giá trị r _does not_ làm cho nó rõ ràng bạn sẽ di chuyển nó. Nó chỉ là một tham chiếu, nó không được di chuyển cho đến khi hàm quyết định di chuyển nó, nó có thể không. Bởi bởi giá trị _guarantees_ nó sẽ được di chuyển, không có cách nào khác để lấy tham số trong đó –

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