There's your invalid conversion.
cs = new char[length+1];
The idea that a c_str function should allocate an unmanaged string buffer doesn't look good, though.
More commonly this should look like:
All the const's so that the user wouldn't be able to mess around with the internal buffer.
const char* String::c_str() const
If they now want to store that into a dynamically allocated char array, that's entirely up to them to do in the calling code.
Otherwise, most often you'd use the c_str method like this:
When done your way, that would be a memory leak.