Theo như tôi hiểu, C ++ 14 đã giới thiệu std::make_unique
bởi vì, do thứ tự đánh giá tham số không được chỉ định, điều này không an toàn:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Giải thích: nếu lần đánh giá đầu tiên cấp phát bộ nhớ cho con trỏ thô, sau đó các lệnh gọi g()
và một ngoại lệ được đưa ra trước khi std::unique_ptr
xây dựng, thì bộ nhớ sẽ bị rò rỉ.)
Gọi điện std::make_unique
là một cách để hạn chế thứ tự cuộc gọi, do đó giúp mọi thứ an toàn:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Kể từ đó, C ++ 17 đã làm rõ thứ tự đánh giá, làm cho Cú pháp A cũng an toàn, vì vậy đây là câu hỏi của tôi: vẫn còn lý do để sử dụng hàm tạo std::make_unique
over std::unique_ptr
's trong C ++ 17? Bạn có thể cho một số ví dụ?
Hiện tại, lý do duy nhất tôi có thể tưởng tượng là nó chỉ cho phép nhập MyClass
một lần (giả sử bạn không cần dựa vào tính đa hình với std::unique_ptr<Base>(new Derived(param))
). Tuy nhiên, đó có vẻ như là một lý do khá yếu, đặc biệt là khi std::make_unique
không cho phép chỉ định một trình phân định trong khi phương std::unique_ptr
thức khởi tạo của thì không.
Và chỉ cần nói rõ, tôi không ủng hộ việc xóa std::make_unique
khỏi Thư viện Chuẩn (ít nhất là giữ cho nó có ý nghĩa đối với khả năng tương thích ngược), mà là tự hỏi liệu vẫn còn những tình huống mà nó được ưu tiên hơnstd::unique_ptr
std::unique_ptr
? Nó không phải là một lý lẽ để chống lạimake_unique