假设我有某个T类的std :: list。
管理这些元素的最佳方法是什么?考虑到只有经理(我的意思是 - 一个所有者)可以在列表中添加或删除项目。
1)
std::list < T* > myList;
//adding the new element
myList.push_back( new T(..) );
//deleting the one element
...roaming through the list...got it...
delete *iterator;
myList.erase(iterator);
2)
std::list < std::unique_ptr<T> > myList;
//adding the new element
myList.push_back ( std::unique_ptr<T>( new T(..) );
//deleting the one element
...roaming through the list...got it...
myList.erase(iterator);
答案 0 :(得分:3)
用Herb Sutter's GotW column的话说:
指南:要分配对象,请更喜欢编写make_unique 默认,并在知道对象的生命周期时编写make_shared 将使用shared_ptrs进行管理。
std::list < std::unique_ptr<T> > myList;
//adding the new element
myList.push_back ( std::make_unique<T>(..) );
//deleting the one element
...roaming through the list...got it...
myList.erase(iterator);
您可以将Stephan T. Lavavej的accepted C+14 proposal用于std :: make_unique实现。
答案 1 :(得分:1)
如果程序中的所有权模型是列表“拥有”其中的元素,则第二种方式(即使用unique_ptr<T>
)更好。它允许C ++自动管理列表的资源,这在列表在本地范围内声明的情况下尤其重要,因为您不必担心过早退出范围。