Насколько мне известно...
Статический массив:
- Размер должен быть известен на момент компиляции. Твой пример - это нестандартная фишка ряда компиляторов, по-хорошему для статического массива размер не должен быть динамическим (определяться во время выполнения).
+ Компилятор сам позаботится об удалении массива.
Динамический массив:
+ Размер может определяться во время выполнения.
- Нужно не забыть освободить память массива самостоятельно.
А вообще, если нет причин делать иначе, используй std::vector. Если тебе понадобится именно массив в стиле C, вектор позволяет его легко получить методом .data().
+ Размер не просто динамический, вектор может переаллоцировать свою память по мере надобности. Так что для ситуаций, когда размер заведомо неизвестен, вектор весьма удобен.
+ Вектор сам управляет своей памятью. Убил вектор - убил управляемый им массив.