C++ 内存管理:字符数组和=运算符

C++ 内存管理:字符数组和=运算符,c++,memory-management,memory-leaks,copy-constructor,rule-of-three,C++,Memory Management,Memory Leaks,Copy Constructor,Rule Of Three,内存管理:字符数组和=运算符 在内存管理方面,下面的代码会有什么错误 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::Stri

内存管理:字符数组和=运算符

在内存管理方面,下面的代码会有什么错误

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;
}
类字符串
{
公众:
字符串(const char right[]);
字符串和运算符=(常量字符串和右侧);
int length()常量;
私人:
字符*缓冲区;
内伦;
};
int String::length()常量{return len;}
字符串::字符串(const char right[])
{
len=0;
while(右[len]!='\0')
len++;
缓冲区=新字符[len+1];
对于(int i=0;i
~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;
}

如果没有析构函数,每次在类中新建缓冲区时,它都将是内存泄漏,因为代码无法消除它。

它没有实现,这意味着它是一个等待发生的seg错误。赋值运算符的实现也很愚蠢。构造函数没有那么糟糕,但仍然是no gem.最后,没有析构函数,这意味着它是一个内存泄漏工厂,在所有其他错误之上。
操作符=
是一个正在等待发生的缓冲区溢出,并且没有析构函数或复制赋值操作符…除了明显的非常糟糕的事情之外,不需要手动计算构造函数,或用于手动复制。使用
delete
时,无需检查
NULL
。您的
运算符=
应使用
常量字符串&
并返回
字符串&
。为确保异常安全,请在
删除之前始终分配新空间(正如
new
可以抛出-如果抛出,将使对象保持一致状态)。