A std::string's allocation is not guaranteed to be contiguous under the current standard, but the new standard forces it to be. In practice, neither I nor Herb Sutter know of an implementation that does not use contiguous storage.
EDITED TO ADD: Following the comments below, it is guaranteed by the current standard if strLength > 0, otherwise invokes undefined behavior. It would not be guaranteed if you did str.begin() or &*str.begin(), but for &s[0] the standard defines operator[] as:
Returns: If pos < size(),
returns data()[pos]. Otherwise, if pos
== size(), the const version returns charT(). Otherwise, the
behavior is undefined.
This is where the undefined behavior would occur if strLength == 0.
Continuing on, data() is defined as:
Returns: ... a pointer to the
initial element of an array whose
first size() elements equal the
corresponding elements of the string
controlled by *this ...
Since you resize, you should have a contiguous array of at least strLength. Note that the memcpy is not copying a null terminator, but if it did would have not been guaranteed to work.