Это старый трюк C, который использовался для обхода недоступности массивов переменной длины в обычном C. Да, он также работает в C ++, если вы используете подходящие конструкции распределителя (например, выделяя кучу необработанной памяти желаемый размер, а затем размещение нового объекта там). Это безопасно до тех пор, пока вы не бродите по концу выделенной памяти, но это может сбить с толку хотя бы некоторых отладчиков памяти.
При использовании этого метода вы должны быть абсолютно уверены, что массив переменной длины является последним элементом в макете объекта, в противном случае вы будете обходить другие внутренние переменные.
Однако я немного сомневаюсь в реализации фабричной функции - я предполагаю, что параметр 'size' на самом деле является желаемым размером массива? Кроме того, не забывайте, что вам придется освобождать память, указанную выше, используя «free», а не «delete», хотя последний может работать в большинстве случаев.
Если нет веских причин, по которым память должна управляться таким образом, я бы просто заменил массив на std :: vector.