C ++ наследование и утечка памяти в valgrind - PullRequest
2 голосов
/ 11 марта 2020

Я проверял свои коды с помощью valgrind, и он обнаружил утечку памяти. Я не понял, почему это произошло. Вместо того, чтобы помещать свой основной код, я создал аналогичную программу, чтобы проверить, не вызывают ли мои другие выделения (массив символов и т. Д. c) проблему или классы.

class zoo{
public:
    int x;
    zoo(int a){x = a;};
};

class doo:public zoo{
public:
    int y;
    doo(int a,int b):zoo(a){y = b;};
};

class foo : public doo{
public:
    String z;
    foo(int a, int b, const char *c):doo(a,b){
        z = c;
    };
};

zoo * something(const char * str){
    return (zoo *) new foo(1,2,str);
}
int main() {
    zoo * ex = something("blabla:sometext:blabla:overflow:message");
    cout<<"msg:"<< ((foo*)ex)->z<<endl;
    delete ex;
    return 0;
}

Ничего сложного в коде. Существуют базовые классы, и я хочу получить указатель на последний класс в качестве указателя на первый базовый класс.

Когда я компилирую это valgrind показывает 4 выделяет 3 освобождения.

Что не так с этим кодом? Возможно, я неправильно понял концепцию наследования. Тем не менее, когда я вызываю функцию что-то как

something("blabla")

Ошибка не печатается.

1 Ответ

2 голосов
/ 11 марта 2020

Поскольку в базовом классе нет виртуального деструктора, в этом операторе

delete ex;

вызывается только деструктор класса zoo в соответствии с типом указателя stati c. Подобъекты объекта типа foo, созданные в этом операторе

return (zoo *) new foo(1,2,str);

, не уничтожаются.

Вы можете по крайней мере определить деструктор в классе zoo like

class zoo{
public:
    int x;
    zoo(int a){x = a;};
    virtual ~zoo() = default;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...