我应该对已定义的智能指针使用make_unique还是reset()?

时间:2016-12-20 17:04:19

标签: c++ c++11

假设我有一个可选择分配对象并返回它的函数:

// 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?只是寻找最佳实践。

1 个答案:

答案 0 :(得分:6)

不要这样做,请使用std::make_unique

如果我要查看你的代码,并看到对reset的调用,我可能想知道智能指针之前指的是什么指针,并尝试找到更改该指针所有权的代码。但是你的情况下智能指针是空的!

这很奇怪,为什么你会在空指针上调用reset,它已经为空/“重置”。尝试编写代码,以便您的意图更好,更明确,在这种情况下,即使两者在技术上等同于您的情况,也请使用std::make_unique。它更好地描述了你要做的事情(初始化一个新的智能指针,而不是改变它的所有权)。