提问人: 提问时间:4/23/2013 更新时间:4/23/2013 访问量:105
内存管理:字符数组和 = 运算符
Memory Management : character arrays and = operator
问:
内存管理:字符数组和 = 运算符
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;
}
答。 我不知道...你能帮我吗? 数组大小似乎还可以...新操作员... 是因为没有删除运算符而悬空的指针吗? 还是三法则?
感谢您的帮助! 请告诉我。 谢谢
答:
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
使用时无需检查。你应该拿一个并返回一个.为了异常安全起见,请始终在您之前分配新的空间(可以抛出 - 如果这样做,这将使对象处于一致状态)。NULL
delete
operator=
const String&
String&
delete
new
下一个:分割故障;三法则
评论
operator=