There are a host of generally innocuous warnings that valgrind will throw from stdlib functions since they "cheat" a little. But this is not the case here:
char* c = new char; // this is bad
only allocates a char - not a buffer of chars, try:
char* c = new char[s->size()+1];
and then change the delete to:
delete [] c;