Деструкторы автоматически вызывают деструкторы для переменных-членов разрушаемого объекта. Эти деструкторы могут или не могут освободить память. Однако указатель не имеет деструктора, или, если вы предпочитаете, деструктор указателя ничего не делает. Это не освобождает память, на которую оно указывает. Если объект содержит указатель на объект, полученный из «new» или «malloc», это зависит от программиста этого объекта, чтобы заставить деструктор сделать правильную вещь. Вы должны запрограммировать свой деструктор на «удаление» или «освобождение» памяти, если она концептуально является частью разрушаемого объекта. Например, «векторный» объект обычно получает память из кучи, поскольку объем требуемой памяти обычно не известен во время компиляции. Эта память концептуально является частью векторного объекта, и, таким образом, программист векторного класса должен вызвать «delete» для него в деструкторе. Стандартные классы библиотеки шаблонов, такие как std :: vector, делают это правильно.
С другой стороны, некоторые объекты содержат ссылки на другие объекты. Словарь или указатель будет содержать ссылки (указатели) на объекты, которые концептуально не являются их частью. Эта память не должна быть освобождена деструктором. (Если вы удалите свой номер телефона из телефонной книги, вы не хотите, чтобы ваш телефон автоматически исчезал.)
Существуют исключения, с которыми начинающему не нужно беспокоиться. Один из них - когда объект и его контейнеры запрограммированы на использование подсчета ссылок, и объект, на который делается ссылка, в действительности не освобождается до тех пор, пока последний ссылающийся на него объект не отпустит его. Другое исключение в случае «размещения нового».