C++类运算符重载后被析构时出错!环境:VC++问题:实现类运算符+重载,结果在析构时出现错误class FS{public:F
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&
[解决办法]请添加拷贝构造函数和赋值运算符
所有涉及到内存分配的类都应该自定义构造函数,拷贝构造函数,赋值运算和析构函数
你的代码在每次进行值传递时都会拷贝一次指针,导致指针被多析构一次
[解决办法]那是临对象在表达式终止处自动析构了,换成下面这样试试。
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不是内存泄露么?