Вы должны предпочесть сказать, что объект имеет динамическое хранилище, а не "находиться в куче". Аналогично, используйте «автоматическое хранение» вместо «в стеке».
Первые фактически используются в стандарте, в то время как последние более разговорные.
Если объект имеет автоматическое хранение, то компилятор автоматически вызывает его деструктор, когда объект выходит из области видимости (в конце содержащего его блока).
Память, выделенная с помощью new
, должна быть явно освобождена. Хранилище для фактического указателя будет восстановлено, но не объект, на который он указывает.
Итак, если вы используете new
, вам нужно иметь соответствующий delete
. new[]
должен соответствовать delete[]
.
(«Умный указатель» весьма полезен, поскольку он поможет вам избавиться от необходимости отслеживать new
и delete
. Посмотрите!).
Уничтожение вектора (либо с помощью удаления, если выделено с новым, либо когда он покидает область действия, если авто) вызовет деструктор его элементов. Вот почему мы должны предпочитать удерживать несколько объектов.
Вывод:
Если возможно, попробуйте использовать умные указатели или коллекции.
В противном случае, убедитесь, что вы delete
, что вы new
. (И если вы напишите класс, выделите в конструкторе любые динамические члены и удалите их в деструкторе класса.)