Любой блок памяти, выделенный с помощью new
, недоступен до тех пор, пока он не будет освобожден либо соответствующим delete
, либо когда процесс, в котором была выделена память, завершится.
Распределитель памяти на самом деле не знает, какие ссылки вы поддерживаете на выделенных объектах. Он просто позволяет вам освободить соответствующие блоки памяти, если вам удастся предоставить действительные адреса.
Как вы будете отслеживать эти адреса, полностью зависит от вас.
Поэтому, если по какой-то причине вы потеряете часть памяти (перезаписав указатель данных, как в вашем примере, или просто забыв использовать его в какой-то момент для освобождения памяти), вы лишаете свою систему этого бита памяти до тех пор, пока основной процесс завершается.
Это становится утечкой памяти, если «провал памяти» происходит непреднамеренно, тем более, если это происходит неоднократно.
Например, если вам нужны данные с таким же сроком жизни, как и у процесса, вы можете выполнить однократное выделение памяти и никогда не освобождать память (поскольку она будет освобождена автоматически по завершении). Это может привести в ужас фанатиков хороших практик, но, тем не менее, не будет считаться утечкой памяти.
С другой стороны, есть и другие способы запутать ваш распределитель памяти: передача недопустимого указателя на delete
(включая ссылку на уже освобожденный объект, т.е. удаление одного и того же экземпляра объекта более одного раза, или указатель на что-то, что не был выделен new
, как локальная или глобальная переменная) откроет вам чудесную область неопределенного поведения, которое может привести к случайным потерям памяти, повреждению данных или ядерным расплавлениям.
person
kuroi neko
schedule
19.03.2017