假设我有一个可选择分配对象并返回它的函数:
// Class member
std::deque<Packet> m_receiveQueue;
// Function in class that operates on the queue
template<typename T>
std::unique_ptr<T> Get()
{
std::unique_ptr<T> response;
if (!m_receiveQueue.empty())
{
response = std::make_unique<T>(m_receiveQueue.front());
m_receiveQueue.pop();
}
return response;
}
我应该这样做:
response.reset(new T{m_receiveQueue.front()});
为什么或为什么不呢?同样的建议也适用于其他智能指针,例如shared_ptr
?只是寻找最佳实践。
答案 0 :(得分:6)
不要这样做,请使用std::make_unique
。
如果我要查看你的代码,并看到对reset
的调用,我可能想知道智能指针之前指的是什么指针,并尝试找到更改该指针所有权的代码。但是你的情况下智能指针是空的!
这很奇怪,为什么你会在空指针上调用reset
,它已经为空/“重置”。尝试编写代码,以便您的意图更好,更明确,在这种情况下,即使两者在技术上等同于您的情况,也请使用std::make_unique
。它更好地描述了你要做的事情(初始化一个新的智能指针,而不是改变它的所有权)。