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

Memory Management : character arrays and = operator

提问人: 提问时间:4/23/2013 更新时间:4/23/2013 访问量:105

问:

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

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

答。 我不知道...你能帮我吗? 数组大小似乎还可以...新操作员... 是因为没有删除运算符而悬空的指针吗? 还是三法则?

感谢您的帮助! 请告诉我。 谢谢

C++ 管理 内存 泄漏 复制构造函数 三法则

评论

1赞 WhozCraig 4/23/2013
它没有实现三法则,这意味着它是一个等待发生的段错误。赋值运算符在实现中也相当愚蠢。构造函数,没有那么糟糕,但仍然没有宝石。最后,没有析构函数,这意味着它是一个内存泄漏工厂,上面有其他所有问题。
1赞 Yuushi 4/23/2013
这是一个缓冲区溢出,只是乞求发生,并且没有析构函数或复制分配运算符......operator=
0赞 Some programmer dude 4/23/2013
除了显而易见的非常糟糕的事情之外,不需要在构造函数中手动计算字符串长度,也不需要手动复制。

答:

0赞 Jesse Moreland 4/23/2013 #1

这就是我所能建议的

~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赞 Yuushi 4/23/2013
使用时无需检查。你应该拿一个并返回一个.为了异常安全起见,请始终在您之前分配新的空间(可以抛出 - 如果这样做,这将使对象处于一致状态)。NULLdeleteoperator=const String&String&deletenew