c++ memory-leaks undefined-behavior unique-ptr virtual-destructor

c++ - valgrind muestra pérdida de memoria en std:: make_unique



memory-leaks undefined-behavior (1)

Estoy usando valgrind para comprobar si hay fugas de memoria. Desafortunadamente recibo una advertencia Leak_DefinitelyLost .

Se adjunta una versión simplificada de mi código que reproduce el error:

#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; }

La pérdida ocurre durante la llamada make_unique :

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

No estoy seguro de lo que estoy haciendo mal. ¿Puede alguien aclarar dónde se produce el error?

(Estoy llamando a valgrind desde CLion 2018.1.5, Valgrind 3.13.0)


Base le falta un destructor virtual, por lo que invocas UB.