Пару месяцев назад я задал этот вопрос, где я спросил, почему произошла утечка памяти.Видимо, я забыл виртуальный деструктор.
Теперь я пытаюсь понять, почему это не утечка памяти:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Base{
public:
explicit Base(double a){
a_ = a;
}
virtual void fun(){
cout << "Base " << a_ << endl;
}
protected:
double a_;
};
class Derived : public Base{
public:
Derived(double a, double b): Base(a), b_{b}{
}
void fun() override{
cout << "Derived " << a_ << endl;
}
private:
double b_;
};
int main() {
vector<unique_ptr<Base> > m;
for(int i=0; i<10; ++i){
if(i%2 == 0){
m.emplace_back(make_unique<Base>(i));
}else{
m.emplace_back(make_unique<Derived>(i, 2*i));
}
}
for(const auto &any:m){
any->fun();
}
return 0;
}
Обратите внимание, что у меня нет виртуального деструктора для Base
.
Я думал, что из-за того, что у меня есть вектор m
типа unique_ptr<Base>
, вызывается только деструктор из Base
, и моя переменная b_
в Derived
протекает, но, по словам Вэлгринда, это не такдело.Почему это не утечка памяти?
Я проверил это с помощью valgrind-3.13.0