valgrind montre une fuite de mémoire dans std:: faire unique

j'utilise valgrind pour vérifier les fuites de mémoire. Malheureusement je reçois un Leak_DefinitelyLost avertissement.

ci-Joint une version simplifiée de mon code qui reproduit l'erreur:

#include <iostream>
#include <vector>
#include <memory>
#include <unordered_map>


using namespace std;

class Base{
public:
    explicit Base(double a){
        a_ = a;
    }
    virtual void fun() = 0;

protected:
    double a_;
};


class Derived_A : public Base{
public:
    Derived_A(double a, vector<double> b, vector<double> c): Base(a), b_{b}, c_{c}{
    }
    void fun() override{
        cout << "Derived_A " << a_ << endl;
    }
private:
    vector<double> b_;
    vector<double> c_;
};


class Derived_B : public Base{
public:
    Derived_B(double a, double b, double c): Base(a), b_{b}, c_{c}{
    }
    void fun() override{
        cout << "Derived_B " << a_ << endl;
    }

private:
    double b_;
    double c_;
};

int main() {

    unordered_map<string, unique_ptr<Base> > m;

    for(int i=0; i<10; ++i){
        unique_ptr<Base> o;
        if(i%2 == 0){
            vector<double> b{1., 2., 3.};
            vector<double> c{4., 5., 6.};
            o = make_unique<Derived_A>(i, move(b), move(c));
            m[to_string(i)] = move(o);
        }else{
            double b = 1.;
            double c = 2.;
            o = make_unique<Derived_B>(i, b, c);
            m[to_string(i)] = move(o);
        }
    }

    for(const auto &any:m){
        any.second->fun();
    }

    return 0;
}

Le perdu qui se passe pendant l' make_unique appel:

Leak_DefinitelyLost
vg_replace_malloc.c
240 bytes in 10 blocks are definitely lost in loss record 1 of 1
    operator new(unsigned long)
    __gnu_cxx::new_allocator<double>::allocate(unsigned long, void const*)
    std::allocator_traits<std::allocator>::allocate(std::allocator<double>&, unsigned long)
    std::_Vector_base<double, std::allocator>::_M_allocate(unsigned long)
    std::_Vector_base<double, std::allocator>::_M_create_storage(unsigned long)
    std::_Vector_base<double, std::allocator>::_Vector_base(unsigned long, std::allocator<double> const&)
    std::vector<double, std::allocator>::vector(std::vector<double, std::allocator> const&)
    Derived_A::Derived_A(double, std::vector<double, std::allocator>, std::vector<double, std::allocator>)
    std::_MakeUniq<Derived_A>::__single_object std::make_unique<Derived_A, int&, std::vector, std::vector>(int&, std::vector<double, std::allocator>&&, std::vector<double, std::allocator>&&)
    main

Je ne suis pas sûr de ce que je fais mal. Quelqu'un peut-il préciser si l'erreur se produit?

(je vais appeler valgrind de CLion 2018.1.5, Valgrind 3.13.0)

21
demandé sur Jarod42 2018-09-05 11:24:07

1 réponses

Base manque un destructeur virtuel, donc vous invoquez UB.

42
répondu Jarod42 2018-09-05 08:25:47