簡體   English   中英

使用C ++ 17功能可以更好地刪除容器中的所有指針

[英]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_eachlambda函數一起使用。

這是一種方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM