假设我有一个函数可以选择分配一个对象并返回它:
// 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/