El problema es muy simple, no estas reservando espacio suficiente y por lo tanto estas corrompiendo la memoria. El metodo size devuelve el numero de CARACTERES de la cadena y esto no incluye el 0 terminador. Por ejemplo si la cadena era "HOLA" size devuelve 4, es lo que reservas con new, y despues llamas a strcpy que va a copiar "HOLA" y el 0 terminador de cadena.
En cualquier caso me parece que estas perdiendo el tiempo con memoria dinamica cuando la solucion mas simple y logica no es crear una copia del string sino usar un casting con el metodo que ya usas (c_str) para obtener su contenido.
Código:
status = send(m_sock, data.c_str() + total, bytesleft, 0);