Por un lado tienes esto:
Todo lo que hay después del return no se va a ejecutar.
Pero vamos, que no creo que tu problema sea ese.
A ver, lo lógico sería que esa función únicamente cree un nuevo vector a partir de otros dos ya existentes, luego esta función no debería liberar memoria. Eso implica borrar los dos free que tienes que, además no se ejecutan, luego mejor quitarlos.
Lo que sucede es que tienes que encargarte de liberar la memoria reservada por los vectores cuando ya no los necesites.
Un ejemplo de laguna de memoria:
Código C++:
Ver originalchar* NewArray( int length )
{
char* to_return
= calloc( length
, sizeof( char ) ); return to_return;
}
int main( )
{
char* array = NewArray( 5 ); // OK
array = NewArray( 10 ); // Laguna de memoria, se pierde el puntero al primer array.
free( array
); // Liberamos el array de 10, pero el de 5 sigue vivo. Perdido pero vivo. }
Para darte más detalles sobre las lagunas de memoria es conveniente conocer todo el código... básicamente porque Valgrind te dice dónde se han hecho las reservas que están generando lagunas, pero no puede identificar dónde debería liberarse esta memoria (y es ahí donde tienes que actuar).
Un saludo.