Основной способ избежать этого - просто избегать использования new
или delete
при любых, но наиболее строго контролируемых обстоятельствах.
Использование new
внутри main
особенно подозрительно - причина использования new
в C ++ - это когда вам нужно создать объект, который должен пережить область, в которой он находится создано (например, когда вы достигнете конца этой функции, она должна быть не уничтожена). В случае main
, только причина делать то, что было бы, если бы вы выделяли что-то в main
, что не будет удалено в main, но используется некоторыми деструктор какого-то глобального объекта, который запускался после того, как вы вернулись из main
(что редко делается и еще реже хорошая идея).
Большинство случаев использования new
должно быть в ctor объекта, а большинство случаев использования delete
должно быть в dtor объекта. Если у вас есть что-то вроде коллекции, может также иметь смысл использовать new
и / или delete
в некоторых других функциях-членах, которые обрабатывают такие вещи, как изменение размера коллекции.
Кроме этого, существуют объекты-сущности, которые обычно никогда не назначаются и не копируются. Например, рассмотрим систему маршрутизации вызовов, в которой вы создаете объект «вызов», когда кто-то набирает свой телефон, и уничтожаете объект, когда он вешает трубку. Практически в каждом таком случае у вас есть глобальная коллекция (или несколько), в которой хранятся указатели на эти объекты, поэтому, как только вы создаете объект, его адрес попадает в (правильную) глобальную коллекцию. Интересный момент: почти весь код, который я видел, где этот шаблон имел смысл, имел , а не какой-либо внешний код, который разрушил объект - скорее, сам объект отвечал за удаление себя из глобального соединения, и используя (много спорили, о) delete this;
уничтожить себя, когда в реальном мире соединение (или любой другой), он был прикреплен к закончился.