0

памяти управления: массивы символов и оператор =Память: символьные массивы и оператор =

Q. С точки зрения управления памятью, какая ошибка будет иметь со следующим кодом?

class String 
{ 
public: 
String(const char right[]); 
String& operator= (const String& right); 
int length() const; 
private: 
char* buffer; 
int len; 
}; 

int String::length() const {return len;} 

String::String(const char right[]) 
{ 
    len = 0; 
    while (right[len] != '\0') 
    len++; 
    buffer = new char[len+1]; 
    for (int i = 0; i < len; i++) 
    buffer[i] = right[i]; 
    buffer[len] = '\0'; 
} 

String& String::operator= (const String& right) 
{ 
    int n = right.length(); 
    for (int i = 0; i <= n; i++) 
    buffer[i] = right.buffer[i]; 
    return *this; 
} 

Ответ. У меня нет подсказки ... Не могли бы вы мне помочь? Размер массива выглядит нормально ... новый оператор ... Это из-за висячего указателя, потому что нет оператора удаления? Или правило трех?

Буду признателен за вашу помощь! Пожалуйста, дайте мне знать. Спасибо,

+1

Он не реализует [Правило трех] (http://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)), что означает, что его ожидает ошибка seg. Оператор присваивания также довольно уродлив в своей реализации. Конструктор, не совсем плохой, но все равно не камень. Наконец, никакой деструктор, что означает его фабрику утечки памяти поверх всего, что с ней не так. – WhozCraig

+1

«operator =' - это переполнение буфера, просто попрошайничество, и нет никакого деструктора или оператора присваивания копии ... – Yuushi

+0

Помимо очевидных действительно плохих вещей, нет необходимости в ручном вычислении длины строки в конструкторе, или для ручного копирования. –

ответ

0

все, что я могу предложить

~String() 
{ 
    if(buffer) 
     delete [] buffer; 
    len = 0; 
} 

String(int length) 
{ 
    buffer = new char[length]; 
    len = length; 
} 

String String::operator = (String rhs) 
{ 
    if(this != &rhs) 
    { 
     delete [] buffer; 
     buffer = new char[strlen(rhs.m_str) + 1]; 
     strcpy(buffer, rhs.buffer); 
    } 

    return *this; 
} 

Если у вас нет деструкторов, каждый раз, когда вы НОВО буфер в своем классе, это будет утечка памяти, потому что ваш код не имеет возможности избавиться от него.

+0

При использовании 'delete' вам не нужно проверять' NULL'. Ваш 'operator =' должен принимать 'const String &' и возвращать 'String &'. Для обеспечения безопасности исключений всегда выделяйте новое пространство перед тем, как «delete» (поскольку «new' может выбрасывать - это оставит объекты в согласованном состоянии, если это произойдет). – Yuushi

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

  • Нет связанных вопросов^_^