假设我像这样重载了C++运算符,例如~=

Foobar& Foobar::operator~() const {
  Foobar *result = new Foobar();
  // compute *result based on *this
  return *result;
}

Foobar& Foobar::operator=(Foobar& arg) {
  // compute *this based on arg
  // return *this for transitivity
  return *this;
}

出于向后兼容性和性能的原因,运算符(operator)必须返回Foobar&,而不是Foobar或指针。

然后,我类的用户将编写如下内容:
Foobar obj0, obj1;

obj1 = ~obj0;

现在,从~返回的new的返回丢失了,所以没有办法将delete变成new,所以没有内存泄漏吗?如果有泄漏,该如何设计从而没有泄漏?

最佳答案

没错,这会导致内存泄漏。普通的operator~不会通过引用返回,而是通过值返回。运算符还应为常量,以强制您不要更改操作数。使用这种方法不会有任何内存泄漏:

Foobar Foobar::operator~() const
{
  Foobar result;
  // compute *result based on *this
  return result;
  // OR
  return Foobar(<stuff to compute result>);
}

07-24 09:45
查看更多