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

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

最佳答案

不要这样做,使用 std::make_unique 一个。

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

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

关于c++ - 我应该对已经定义的智能指针使用 make_unique 还是 reset() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247630/

相关文章:

c++ - 内存映射文件对于不断变化的数据有害吗?

c++ - std::thread 导致应用程序中止并出现错误 R6010

c++ - 带有自定义类的 std::atomic (C++ 11)

c++ - 如果容器和分配器都属于同一个内存池,我还需要调用 std::container 的析构函数吗?

C++ 结构 tm 和 time_t

c++ - queue<T> 上的原子操作?

c++ - 在发布配置中构建时未导出 DLL 函数

c++ - Qt WebEngine 失败

c++ - 将值乘以 static_cast<uint8_t> 时如何确定 auto 的类型

c++ - 以编程方式为所有用户设置注册表软件策略 key