Используйте возможности C ++ 17 для лучшего удаления всех указателей из контейнера - PullRequest
0 голосов
/ 25 февраля 2019

До 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);
    }
}

Есть ли более простое решение

Ответы [ 4 ]

0 голосов
/ 25 февраля 2019

Да, используйте умные указатели.И просто 'clear ()' контейнер ... В противном случае это просто "код C, написанный на C ++ 17"

0 голосов
/ 25 февраля 2019

Вы можете использовать for_each с функцией lambda.

Вот способ:

std::for_each(m_map_buff_on_attrs.begin(), m_map_buff_on_attrs.end(), 
              [](auto &item) {delete item.second;}); 
0 голосов
/ 25 февраля 2019

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();
0 голосов
/ 25 февраля 2019

Да.

for (auto it = m_map_buff_on_attrs.begin();  it != m_map_buff_on_attrs.end(); it++)

Поскольку вы используете только значение *it и никаких других данных с этого итератора, цикл для диапазона будет проще.

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...