2

我正在尝试为我的班级重载 operator + ,如下所示:

MyClass MyClass::operator +(const MyClass& rval) const {
 MyClass ret(m_src); // m_src is member of MyClass: char* m_src;
 ret.Add(rval); // this->m_src + rval, this method work correctly 
 return ret; // so, in ret.m_src I have correct value
} // but after this C++ call destructor for ret

析构函数:

delete[] m_src; // because in some methods I allocate dynamic memory

因此,析构函数清除内存和函数返回垃圾。我怎样才能避免这种情况?如果我删除析构函数,函数工作正常,但在这种情况下我有内存泄漏:(

PS:不幸的是,我无法更改重载+的原型。谢谢。

4

2 回答 2

2

您可以通过替换来避免这种情况:

char *m_src; 

经过:

std::string m_src;

在你的课MyClass上。

作为char *一个班级成员,你得到的东西很容易搞砸手动内存管理,你只需用基于 RAII 的隐式内存管理替换它,std::string并为自己省去所有这些麻烦。std::string而这正是C++存在的目的。


如果你不能使用标准库std::string类(虽然我根本不明白为什么),你需要确保你遵循三法则

于 2013-02-03T08:03:41.410 回答
0

你需要的是一个复制构造函数m_src

MyClass::MyClass( const MyClass& ref ) {
    m_src = new char[/*get len from ref*/];
    memcpy( m_src, ref.m_src, /* len from ref */ * sizeof(char) );
}

现在您可以更改operator+使用复制构造函数

MyClass MyClass::operator +(const MyClass& rval) const {
    MyClass ret(rval); // use copy constructor
    ret.Add(rval); // this->m_src + rval, this method work correctly 
    return ret; // so, in ret.m_src I have correct value
}
于 2013-02-03T08:43:33.220 回答