памяти управления: массивы символов и оператор =Память: символьные массивы и оператор =
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;
}
Ответ. У меня нет подсказки ... Не могли бы вы мне помочь? Размер массива выглядит нормально ... новый оператор ... Это из-за висячего указателя, потому что нет оператора удаления? Или правило трех?
Буду признателен за вашу помощь! Пожалуйста, дайте мне знать. Спасибо,
Он не реализует [Правило трех] (http://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)), что означает, что его ожидает ошибка seg. Оператор присваивания также довольно уродлив в своей реализации. Конструктор, не совсем плохой, но все равно не камень. Наконец, никакой деструктор, что означает его фабрику утечки памяти поверх всего, что с ней не так. – WhozCraig
«operator =' - это переполнение буфера, просто попрошайничество, и нет никакого деструктора или оператора присваивания копии ... – Yuushi
Помимо очевидных действительно плохих вещей, нет необходимости в ручном вычислении длины строки в конструкторе, или для ручного копирования. –