Если ваша функция создана для возврата выделенного буфера, утечки нет. Более того, есть утечка, если клиентский код специально вызывает вашу программу и ничего не делает с тем, что возвращает, но в этом случае код клиента нарушает ваш контракт.
Когда буфер возвращается, он контролируется клиентским кодом. В целом, для твердого программирования хорошая идея, чтобы распределение / освобождение происходило на одном уровне. Это означает, что если у вас есть подпрограмма, которая возвращает буфер, у вас должна быть соответствующая подпрограмма, которая освобождает его, даже если код клиента может вызвать delete [].
Например: предположим, у вас есть этот код
char *mylib_gimmeh_buffer() {
char* returnMe = new char[24324];
return returnMe;
}
Для симметрии вы должны иметь также
char *mylib_free_buffer(buffer) {
delete[] buffer;
}
Теперь ваш клиентский код должен вести себя так
buf = mylib_gimmeh_buffer();
/* do something with buf */
mylib_free_buffer(buf);
если ваш клиент делает что-то подобное
mylib_gimmeh_buffer(); // just for fun
или как это
buf = mylib_gimmeh_buffer();
/* do something with buf */
/* never call mylib_free_buffer() */
тогда есть утечка памяти