std::vector<std::unique_ptr<>>::push_back() 的正确语法是什么?
What is the correct syntax for std::vector<std::unique_ptr<>>::push_back()?
我读到如果我想使用 std::vector<std::unique_ptr<T>>
中的 push_back
,我需要为 unique_ptr
定义一个删除器。真的吗?如果是,正确的语法是什么?
感谢您的回答
不,在正常情况下您不需要自定义删除器。对于现有的 unique_ptr
:
vector.push_back(std::move(ptr));
工作正常(将指针的所有权转移到 vector
);对于新指针:
vector.push_back(std::make_unique<MyType>(args, go, here));
是最安全的(因为它确保指针始终受到管理,即使 push_back
抛出异常),其中:
vector.emplace_back(new MyType(args, go, here));
可能会快一点,但如果 vector
引发异常(例如,由于尝试扩展底层存储失败;尽管在那种情况下,您的程序可能会泄漏内存)无论如何都注定了,所以它可能不值得防御。
如果默认删除器不符合您的需要,您只需要编写删除器,因此对于特定资源。
使用 push_back
和可移动不可复制类型的语法是:
std::vector<std::unique_ptr<T>> vs;
vs.push_back(std::make_unique<T>(42));
std::unique_ptr<T> p = std::make_unique<T>(42);
vs.push_back(std::move(p));
我读到如果我想使用 std::vector<std::unique_ptr<T>>
中的 push_back
,我需要为 unique_ptr
定义一个删除器。真的吗?如果是,正确的语法是什么?
感谢您的回答
不,在正常情况下您不需要自定义删除器。对于现有的 unique_ptr
:
vector.push_back(std::move(ptr));
工作正常(将指针的所有权转移到 vector
);对于新指针:
vector.push_back(std::make_unique<MyType>(args, go, here));
是最安全的(因为它确保指针始终受到管理,即使 push_back
抛出异常),其中:
vector.emplace_back(new MyType(args, go, here));
可能会快一点,但如果 vector
引发异常(例如,由于尝试扩展底层存储失败;尽管在那种情况下,您的程序可能会泄漏内存)无论如何都注定了,所以它可能不值得防御。
如果默认删除器不符合您的需要,您只需要编写删除器,因此对于特定资源。
使用 push_back
和可移动不可复制类型的语法是:
std::vector<std::unique_ptr<T>> vs;
vs.push_back(std::make_unique<T>(42));
std::unique_ptr<T> p = std::make_unique<T>(42);
vs.push_back(std::move(p));