[英]Use C++17 features to better delete all pointers from a container
在C ++ 17之前,從映射中刪除所有指針看起來像:
for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
{
if (NULL != it->second)
{
delete(it->second);
}
}
m_map_buff_on_attrs.clear();
使用C ++ 17,我們得到:
for (auto it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
{
if (NULL != it->second)
{
delete(it->second);
}
}
有沒有更簡單的解決方案?
是。
for (auto it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
由於只使用*it
值*it
而沒有該迭代器的其他數據,因此for-range循環會更簡單。
if (NULL != it->second)
{
delete(it->second);
}
刪除NULL
是明確定義的,並且無效,這是您可以跳過的測試。
這使:
for (auto& p : m_map_buff_on_attrs) {
delete p.second;
}
操縱原始指針容易出錯,並使您編寫更多無用的代碼。 如果m_map_buff_on_attrs
是智能指針的映射,則您的代碼將僅僅是:
} // m_map_buff_on_attrs goes out of scope and destroys and frees everything.
RAII模式是您的朋友:
using TMapBuffOnAttrs = std::map<std::string, std::unique_ptr<Attr>>;
m_map_buff_on_attrs["attrName"] = std::make_unique<Attr>(x, a);
....
// loop is not needed, to delete just do:
m_map_buff_on_attrs.clear();
您可以將for_each
與lambda
函數一起使用。
這是一種方法:
std::for_each(m_map_buff_on_attrs.begin(), m_map_buff_on_attrs.end(),
[](auto &item) {delete item.second;});
是的,請使用智能指針。 然后簡單地'clear()'容器...否則,這僅僅是“用C ++ 17編寫的C代碼”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.