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

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

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

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;
}

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]