Здравствуйте
Нужно создавать указатель на него?
В с массивы не возращают или он не массив?
Тут у них хитро. Пример попроще
QString a("Test");
QString b = a;
Они держат 1 копию данных (в данном случае "Test") и счетчик объектов которые эти данные используют. Копирование сводится к увеличению этого счетчика. Когда вызовется деструктор "a" счетчик уменьшится на 1. Если Вы попытаетесь изменить "a" - для него будут созданы новые данные а счетчик на старые уменьшится. Когда счетчик обнулится вызывается delete для данных. Поэтому они интенсивно передают и возвращают объекты/контейнеры по значению. С непривычки такой подход "бьет по ушам"
Несмотря на все эту крутизну с "shallow copy" я бы лично наглеть не стал и по значению бы не возвращал. А написал бы скромно и надежно
typedef QMap<QString, int> TMap;
void FillMap( TMap & map )
{
....
}
...
TMap map;
FillMap(map);