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

答え。手がかりがありません... 助けていただけますか?配列のサイズは大丈夫そうです...新しい演算子...削除演算子がないため、ポインタがぶら下がっているためですか?それとも3のルール?

助けていただければ幸いです。私にお知らせください。ありがとう、

4

1 に答える 1

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

デストラクタがない場合、クラスでバッファを新しくするたびに、コードでバッファを取り除く方法がないため、メモリ リークが発生します。

于 2013-04-23T05:45:12.940 に答える