Тебе не нужны 
new и сырые указатели. Тебе нужен линейный контейнер с хранением элементов в непрерывном блоке памяти. Это будет или 
std::vector, или 
std::array.
Для начала можно остановиться на 
векторе. Еще одним важным типом будет 
std::span[
?] или 
gsl::span[
?][
S] если ты не можешь пользоваться C++20.
При реализации твоей функции нужно понять, зачем в твою функцию добавлять управление памятью. В общих случаях, если разработчик начинает управлять памятью в вычислительной функции, это говорит о плохо продуманном алгоритме функции. В редких случаях управление памятью может быть технически обосновано. Твой случай не из таких. В нем незачем управлять памятью, это пользы не сделает, а приведет лишь к переусложнению реализации.
Вот объвление твоей функции: 
gsl::span<float> Метод( gsl::span<float> values ).
span - это не владеющий памятью тип, обозначающий участок непрерывной памяти с данными определенного типа. 
span очень легок и является value type - т.е. создан чтобы его передача по значению не приводила к ощутимым нагрузкам. 
span конструируется из 
std::vector, 
std::array, плоских массивов, 
std::unique_ptr<[]> и сырых блоков памяти.
В своей функции тебе стоит работать с памятью 
values, считая попутно, сколько элементов ты обработал. А для возврата обработанного участка данных тебе будет достаточно вызвать 
subspan.
Псевдокодstd::span<float> Метод( std::span<float> values )
{
	size_t processed_count = 0;
	for( float& element : values )
	{
		// ... обработка значений
		// ... изменение processed_count
		// ... условия обрыва цикла
	}
	
	return values.subspan( 0, processed_count );
}
int main()
{
	std::vector<float> values{ 7.83f, 14.1f, 20.3f };
	std::span<float> processed_values = Метод( values );
	
	for( const float& value : processed_values )
	{
		std::cout << value << ' ';
	}
	
	return 0;
}