Почему память все еще доступна после вызова std :: map :: clear ()?

Кажется, что существует прямой способ:

Если вы действительно хотите просто переименовать филиалы удаленно (без переименования каких-либо локальных ветвей одновременно), вы можете сделать это с помощью одной команды например

git push /:refs/heads/ :

https://stackoverflow.com/a/21302474/2586761

blockquote>

См. оригинальный ответ для более подробной информации

18
задан xan 20 February 2009 в 11:01
поделиться

5 ответов

станд.:: карта не управляет памятью, на которую указывают значения указателя - Вам решать, чтобы сделать это самостоятельно. Если Вы не хотите использовать интеллектуальные указатели, можно записать бесплатную и ясную функцию общего назначения как это:

template <typename M> void FreeClear( M & amap ) 
    for ( typename M::iterator it = amap.begin(); it != amap.end(); ++it ) {
        delete it->second;
    }
    amap.clear();
}

И используйте его:

std::map< int, A * > my_map;
// populate
FreeClear( my_map )

;

20
ответ дан 30 November 2019 в 06:39
поделиться

При хранении указателей на карте (или список, или что-либо как этот) ВЫ - ответственное за удаление указателей, так как карта не знает, были ли они созданы с новым, или нет. Ясная функция только вызывает деструкторы, если Вы не используете указатели.

О, и еще одна вещь: вызов деструктора (или даже вызов удаляют) не означает, что к памяти нельзя больше получать доступ. Это только означает доступ к мусору, если Вы сделаете.

22
ответ дан 30 November 2019 в 06:39
поделиться

Поэтому map.clear() деструкторы вызовов данных содержатся в карте, в Вашем случае, указателя на a. И это ничего не делает.

Вы могли бы хотеть поместить некоторый интеллектуальный указатель в карту для памяти, занятой a быть автоматически исправленным.

BTW, почему Вы помещаете аргументы шаблона в вызов к make_pair? Вычет аргумента шаблона должен сделать вполне прилично здесь.

4
ответ дан 30 November 2019 в 06:39
поделиться

При освобождении части памяти "кучи" ее содержание не становится обнуленным. Они просто доступны для выделения снова. Конечно, необходимо считать память не доступной, потому что эффекты доступа к освобожденной памяти не определены.

На самом деле предотвращение доступа к странице памяти происходит на более низком уровне, и библиотеки станд. не делают этого.

При выделении памяти с новым необходимо удалить ее сами, если Вы не используете интеллектуальный указатель.

1
ответ дан 30 November 2019 в 06:39
поделиться

Любые магазины товаров для хранения Ваш тип объекта и вызывают соответствующих конструкторов: внутренний код каждый узел мог бы выглядеть подобным:

__NodePtr
{
    *next;
    __Ty    Val;
}

То, когда Вы выделяете его, происходит путем построения val на основе типа и затем соединения. Что-то подобное:

_Ty _Val = _Ty();
_Myhead = _Buynode();
_Construct_n(_Count, _Val);

То, когда Вы удаляете его, называет соответствующие деструкторы.

При хранении ссылок (указатели), это не вызовет конструктора, ни это разрушит.

0
ответ дан 30 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: