Когда вы создаете динамический объект, используя new
, какой-то другой объект будет отвечать за его удаление, когда он больше не нужен;этот объект является «владельцем» динамического объекта.
Если бы вы всегда обращались к объекту, используя простые указатели, то трудно сказать (без документации), какой из этих указателей представляет владение.Если вы передадите указатель на функцию, то переходит ли функция в собственность?Или звонящий по-прежнему отвечает за его удаление?Если вы поймете это неправильно, то вы либо не удалите его (что приведет к утечке ресурсов, что может снизить производительность вашей программы и в конечном итоге остановить ее работу), либо вы можете удалить ее слишком рано (что может вызвать всевозможные ошибки,часто очень трудно отследить).
Широко используемое решение для этого состоит в том, чтобы всегда использовать умные указатели (объекты, которые похожи на указатели, но содержат логику для управления временем жизни своей цели) для обозначения владельцаи никогда не удалять ничего, на что у вас есть простой указатель.Тогда никогда не возникает путаницы в том, удалять или нет что-то.Стандартная библиотека предоставляет интеллектуальные указатели (unique_ptr
и shared_ptr
), которые предоставляют общую семантику владения одним объектом и разделяют владение несколькими объектами.
Это один из аспектов более широкой темы ресурсауправление через RAII , что чрезвычайно важно в C ++.Помимо предоставления четкой модели владения, это также единственный разумный способ надежно предотвратить утечки памяти при возникновении исключений.