Почему memleak с новым оператором в списке инициализации конструктора? - PullRequest
0 голосов
/ 19 ноября 2011

Учитывая простой класс в C ++ с закрытой переменной-членом name и базовым конструктором:

#include <QString>

class Testclass
{
  private:
    QString *name;

  public:
    Testclass(): name(new QString()) {}
};

Почему memcheck valgrind жалуется на 8 байтов в 1 блоке, которые определенно теряются при использовании этогоконструктор?

1 Ответ

5 голосов
/ 19 ноября 2011
~Testclass(){delete name;}

Заглушит вашу утечку. C ++ не делает (и не должен) делать это за вас.

ETA: ildjarn правильно указывает, что у вас также должен быть конструктор копирования и оператор присваивания.

TestClass(const TestClass &cp): name(new QString(*(cp.name)) ) {}
const TestClass& operator=(const Testclass&rhs)
{
  (*name)=(*hrs.name);
  return *this;
}

В противном случае конструктор копирования по умолчанию или оператор присваивания будут дважды удалять одну и ту же память. Большинство классов, которым требуется деструктор, должны заменить или отключить конструктор копирования по умолчанию и оператор присваивания. Это называется «Правило трех».

Возможно, вы захотите просто хранить значение QString по значению, потому что он, скорее всего, сам по себе является контейнером облегченного класса, таким как std :: string или std :: vector. Но если вы новичок в C ++, то проделать это один раз - ценный урок.

...