Почему передача указателя объекта в метод, в котором он был удален, отличается от непосредственного удаления объекта? - PullRequest
3 голосов
/ 18 июля 2011

Код, вызывающий утечку одного блока, выглядит следующим образом:


    in = new RandomAccessFile(fileName, "r");
    in->close();
    Mem::delObject(in);

где RandomAccessFile - это класс с полем string, а delObject() - статический метод следующим образом:


    void Mem::delObject(Object* object) {
        delete object;
    }

Блок с утечкой - это блок string.

Если заменить метод delObject на прямой delete:


    in = new RandomAccessFile(fileName, "r");
    in->close();
    delete(in);

утечка исчезла. Если метод не заменен, а удален:


    in = new RandomAccessFile(fileName, "r");
    in->close();
    // Mem::delObject(in);
    // delete(in);

есть два протекающих блока. Я предполагаю поле и объект, который его содержал.

Итак: почему эти два способа удаления объекта ведут себя по-разному?

1 Ответ

11 голосов
/ 18 июля 2011

Я могу только догадываться, но, похоже, вы забыли виртуальный деструктор в классе Object.Таким образом, деструктор RandomAccessFile вызываться не будет, что приведет к утечке его свойств.

...