2011-10-20 5 views
0

У меня возникает ошибка сегментации, и я понятия не имею, как ее отладить! Это происходит после создания массива MyString, т. Е. Массива, созданного без каких-либо проблем.ошибка сегментации C++

void ConcatTest() 
{ 
    cout << "\n----- Testing concatentation on MyStrings\n"; 

    const MyString s[] = 
      {MyString("outrageous"), MyString("milk"), MyString(""), 
      MyString("cow"), MyString("bell")}; 

    for (int i = 0; i < 4; i++) { 
      cout << s[i] << " + " << s[i+1] << " = " << s[i] + s[i+1] << endl; 
     } 
} 

Так что я думаю, что это может быть что-то в том, как я перегружен оператор + здесь:

MyString operator+(MyString str1, MyString str2) 
{ 
    MyString resultStr = MyString(); 
    delete [] resultStr.pString; 
    resultStr.pString = new char[strlen(str1.pString) + strlen(str2.pString) + 1]; 
    MyString temp = MyString(); 
    delete [] temp.pString; 
    temp.pString = new char[strlen(str1.pString) + 1]; 
    strcpy(temp.pString, str1.pString); 
    delete [] str1.pString; 
    str1.pString = new char[strlen(str1.pString) + strlen(str2.pString) + 1]; 
    strcpy(str1.pString, temp.pString); 
    strcat(str1.pString, str2.pString); 
    strcpy(resultStr.pString, str1.pString); 
    return resultStr; 
} 

Любой вид помощи или совета будут оценены!

ответ

1

Вы пытаетесь сделать delete str1.pString примерно на полпути через ваш метод +.

но str1 передается как const MyString, что указывает на статическую строку в программе. Вы не можете освободить это!

скорее всего это причина. Вы не должны изменять str1 или str2 у вашего оператора.

Если я правильно понял вашу прогу, вы хотите изменить входную строку. Для этого вы должны создать свой начальный MyString с массивным символом realchar[], а не статическую строку с кавычками вроде «возмутительной».

так,

char* ch1="outrageous"; // ch1 points to a nonmutable memory area 
char* str1 = new char[strlen(ch1)]; // str1 now points to a mutable region of memory 
strcpy(str1,ch1); // that mutable region now contains the static string 

MyString string1 = new MyString(str1); // this string is now writable/changeable 

это string1 теперь изменчивый;

+0

Да, в объявлении функции можно встретить «const» для str1 и str2. –

+0

Спасибо за объяснение! –

Смежные вопросы