Во-первых, вы не имели в виду:
strcat(str1.data, str1.data);
но:
strcat(str1.data, str2.data);
Во-вторых, куда вы ожидаете str2.data
? Это каракули памяти и, следовательно, ошибки valgrind. Удивило это не просто сбой.
Вам необходимо перераспределить достаточно памяти для объединенной длины, скопировать обе исходные строки и освободить str1.data
, прежде чем переназначить его в новое хранилище.
На основании обновленного сообщения:
friend void operator+=(mystring& str1, const mystring& str2)
{
// Not using a temp mystring here, as the temp never really maintains its state as a mystring
// I am assuming length is the length of the string, not the storage. Not the best design if you consider resizing the the string to less than the storage
int newStringLength = str1.length + str2.length;
char* newStorage = new char[newStringLength + 1];
strcpy(newStorage, str1.data);
// strcat has to scan from the start of the string; we do not need to.
strcpy(newStorage + str1.length, str2.data);
delete[] str1.data;
str1.length = newStringLength ;
str1.data = newStorage;
// Haven't though about the case where str2 is an alias for str1.
}