В первом примере вы явно вызываете деструктор для каждого объекта, на который указывают члены выделенного массива. Затем вы удаляете массив указателей (который на самом деле должен быть delete[]
, потому что вы выделили его как массив, но на практике для этого примера это, вероятно, не имеет значения).
Во втором примере вы удаляете только массив указателей , который не вызывает деструктор для указанных объектов. Причина этого заключается в том, что вы, возможно, сделали копии этих указателей в других переменных, о которых компилятор не обязательно знает.
Если вы создадите массив объектов , а не указателей , например:
MyClass *obj = new MyClass[NUM];
тогда оператор delete[]
автоматически вызовет деструктор для каждого из NUM
объектов в выделенном массиве.