unique_ptr 的 C++ 堆栈
C++ stack with unique_ptr
我有一个遗留程序,它使用 std::stack 对象来存储一些指针。
std::stack<Widget*> widgetStack;
现在我想将其更改为新的 C++11 样式
std::stack<std::unique_ptr<Widget>> widgetStack;
然而代码中有一个函数:
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return null;
}
我正在努力让这个功能与 unique_ptr 一起使用。堆栈是小部件的所有者,只有当堆栈被弹出时,小部件对象才应该被销毁。关于如何解决此问题的任何想法?
如果栈是指针的唯一所有者,那么建议return原始指针,因为原始指针意味着"a pointer without ownership":
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top().get();
}
return nullptr;
}
我个人不喜欢使用原始指针。您可以简单地将 std::unique_ptr
更改为 std::shared_ptr
,如@user202729
所建议
std::stack<std::shared_ptr<Widget>> widgetStack;
std::shared_ptr<Widget> getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return nullptr;
}
这样指针仍然由堆栈管理,您不必以原始形式处理它们。
我在评论中建议参考,但这不是太好的解决方案。返回引用使得难以 return 指示空堆栈(如示例中的 nullptr
)。
我有一个遗留程序,它使用 std::stack 对象来存储一些指针。
std::stack<Widget*> widgetStack;
现在我想将其更改为新的 C++11 样式
std::stack<std::unique_ptr<Widget>> widgetStack;
然而代码中有一个函数:
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return null;
}
我正在努力让这个功能与 unique_ptr 一起使用。堆栈是小部件的所有者,只有当堆栈被弹出时,小部件对象才应该被销毁。关于如何解决此问题的任何想法?
如果栈是指针的唯一所有者,那么建议return原始指针,因为原始指针意味着"a pointer without ownership":
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top().get();
}
return nullptr;
}
我个人不喜欢使用原始指针。您可以简单地将 std::unique_ptr
更改为 std::shared_ptr
,如@user202729
std::stack<std::shared_ptr<Widget>> widgetStack;
std::shared_ptr<Widget> getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return nullptr;
}
这样指针仍然由堆栈管理,您不必以原始形式处理它们。
我在评论中建议参考,但这不是太好的解决方案。返回引用使得难以 return 指示空堆栈(如示例中的 nullptr
)。