2015-11-11 2 views
0

Я пытаюсь воссоздать простой класс строк. Это только для упражнений. Когда мой код заканчивается, я получаю ошибку во время выполнения. Я не совсем уверен, но я думаю, что это утечка памяти.Неизвестная утечка памяти?

Вот код:

class FITString{ 
    char *tekst; 
public: 
    FITString(char *bla = " "){ 
     tekst = new char[strlen(bla) + 1]; 
     strcpy_s(tekst, strlen(bla) + 1, bla); 
    } 
    ~FITString(){ 
     delete[] tekst; 
     tekst = nullptr;   
    } 
    FITString(FITString &original){ 
     tekst = new char[strlen(original.tekst) + 1]; 
     strcpy_s(tekst, strlen(original.tekst) + 1, original.tekst); 
    } 
    FITString operator+ (FITString &drugi){ 
     char *pomocna = new char[strlen(tekst) + strlen(drugi.tekst) + 1]; 
     strcpy_s(pomocna, strlen(tekst) + 1, tekst); 
     strcat_s(pomocna, strlen(tekst) + strlen(drugi.tekst) + 1, drugi.tekst); 
     return pomocna; 
    } 

    void operator+= (FITString &drugi){ 
     strcat_s(tekst, strlen(tekst) + strlen(drugi.tekst) + 1, drugi.tekst);  
    } 

    char & operator[] (int position){ 
     char *pomocni = new char[strlen(tekst)+1]; 
     strcpy_s(pomocni, strlen(tekst) + 1, tekst); 
     if (position <= strlen(tekst)){ 
      pomocni += position; 
      pomocni--; 
      return *pomocni; 
     } 
    } 

    friend ostream & operator<< (ostream &COUT, FITString &obj); 

}; 


ostream & operator<< (ostream &COUT, FITString &obj){ 
    COUT << obj.tekst; 
    return COUT; 
} 

int main() 
{ 
    FITString bezze = "Sta ima"; 
    FITString bezze2 = "Nema nista"; 
    FITString bezze3 = "Ma eo"; 
    FITString bezze4 = bezze + bezze2 + bezze3; 
    cout << bezze4 << endl; 
    FITString bezze5 = "Ma jok"; 
    cout << endl; 

    bezze5 += bezze; 
    cout << bezze5 << endl; 
    cout << bezze5[4] << endl; 
    system("Pause"); 
    return 0; 
} 
+2

В 'operator + =' you 'strcat', не выделяя дополнительного места для новых символов. –

+1

Можете ли вы отправить весь вывод программы и ошибку, которую вы получаете? – EkcenierK

+0

_ Я получаю ошибку времени выполнения. Не могли бы Вы уточнить ? –

ответ

3

Проблема заключается в вашем операторе + =. Вы объединяете строки без выделения необходимого количества места. Ваша функция должна выглядеть следующим образом:

void operator+= (FITString &drugi) { 
    char *pomocna = new char[strlen(tekst) + strlen(drugi.tekst) + 1]; 
    strcpy_s(pomocna, strlen(tekst) + 1, tekst); 
    strcat_s(pomocna, strlen(tekst) + strlen(drugi.tekst) + 1, drugi.tekst); 
    delete[] tekst; 
    tekst = pomocna; 
} 
+0

Спасибо. Думаю, я должен добавить 'delete [] pomocna' после' tekst = pomocna'. И я должен, вероятно, сделать свою функцию 'FITString operator + (FITString & drugi)' так же, как и я. – Kapobajza

+0

На самом деле вам не следует делать 'delete [] pomocna' после' tekst = pomocna'. С 'char * pomocna = new char [...]' вы выделили новое пространство памяти и с помощью 'delete [] tekst'; вы освободили прежнее пространство памяти. 'tekst = pomocna', так что ваш указатель' tekst' укажет на вновь выделенное пространство. –

+0

И для оператора + вы можете видеть @ramteid s ответ –

2

Если вы ищете утечки памяти, есть один в operator+: Последняя строка (return pomocna;) возвращает char*, а не FITString как заявлено. Компилятор не жалуется, потому что FITString имеет «конструктор преобразования» FITString::FITString(char*), он может использовать для создания нужного FITString из возвращаемого значения char*.

Проблема в том, что реализация FITString::FITString(char*) копирует переданную строку, поэтому char* pomocna, выделенный в operator+, никогда не удаляется.

Чтобы избежать таких запутывающих преобразований, я всегда объявляю все конструкторы преобразования и операторы присваивания преобразования как explicit.

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