读书人

C++种运算符重载后被析构时出错

发布时间: 2013-10-01 12:15:56 作者: rapoo

C++类运算符重载后被析构时出错!
环境:VC++
问题:实现类运算符+重载,结果在析构时出现错误


class FS
{
public:
FS(void);
FS(char* s);
~FS(void);

private:
char*m_buf;
int m_len;

public:
FS operator+(FS f1);
operator char*();
};

FS::FS(char* s)
{
m_len = strlen(s);
m_buf = new char[m_len + 1];
memcpy(m_buf, s, m_len);
m_buf[m_len] = '\0';
}

FS::~FS(void)
{
SAFE_DELETE(m_buf); //第3次析构时出错!此时m_buf="111112222233333"
m_len = 0;
}

FS FS::operator +(FS m)
{
char* ss = new char[this->m_len + m.m_len + 1];
memcpy(ss, this->m_buf, this->m_len);
memcpy(ss + this->m_len, m.m_buf, m_len);
ss[this->m_len + m.m_len] = '\0';

memcpy(this->m_buf, ss, this->m_len + m.m_len + 1);
this->m_len = this->m_len + m.m_len;
return *this;
}

FS::operator char*()
{
return m_buf;
}


调用:char* sss = FS("11111") + "22222" + "33333";
在第3次调用析构时出现错误,提示“堆被损坏”。
请问这个该怎么修改? c++ 运算符重载 析构
[解决办法]
FS FS::operator +(FS m)
{
char* ss = new char[this->m_len + m.m_len + 1];
memcpy(ss, this->m_buf, this->m_len);
memcpy(ss + this->m_len, m.m_buf, m_len);
ss[this->m_len + m.m_len] = '\0';

memcpy(this->m_buf, ss, this->m_len + m.m_len + 1);
this->m_len = this->m_len + m.m_len;
return *this;
}

返回类型改为引用类型FS&
[解决办法]
请添加拷贝构造函数和赋值运算符

所有涉及到内存分配的类都应该自定义构造函数,拷贝构造函数,赋值运算和析构函数

你的代码在每次进行值传递时都会拷贝一次指针,导致指针被多析构一次
[解决办法]
引用:
Quote: 引用:

请添加拷贝构造函数和赋值运算符

所有涉及到内存分配的类都应该自定义构造函数,拷贝构造函数,赋值运算和析构函数

你的代码在每次进行值传递时都会拷贝一次指针,导致指针被多析构一次


按照这样修改了之后,可以使用FS ss = FS("11111") +"22222" + "33333";了,但是使用char* ss = FS("11111") +"22222" + "33333";时得到的字符串是错误的字符串("恰恰恰恰恰恰恰恰.."),调试发现是在给ss赋值前调用了析构函数释放了m_buf。请问这样我该怎么修改??


那是临对象在表达式终止处自动析构了,换成下面这样试试。

FS ss = FS("11111") +"22222" + "33333";
char* ss = FS;

[解决办法]
memcpy(this->m_buf, ss, this->m_len + m.m_len + 1);
这也能cpp啊
[解决办法]
你这里好多错误啊,

char* ss = new char[this->m_len + m.m_len + 1];
memcpy(ss, this->m_buf, this->m_len);
memcpy(ss + this->m_len, m.m_buf, m_len);
ss[this->m_len + m.m_len] = '\0';

memcpy(this->m_buf, ss, this->m_len + m.m_len + 1);
--- 没有重新申请内存,能保证m_buf的内存足够用么?
this->m_len = this->m_len + m.m_len;
return *this;
--- ss不是内存泄露么?

读书人网 >C++

热点推荐