Valgrind 在 std::make_unique 中显示内存泄漏
Valgrind shows memory leak in std::make_unique
我正在使用 Valgrind 检查内存泄漏。
不幸的是,我收到 Leak_DefinitelyLost
警告。
附件是我的代码的简化版本,它重现了错误:
#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;
}
丢失发生在 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
我不确定我做错了什么。有人可以澄清错误发生在哪里吗?
(我从 CLion 2018.1.5、Valgrind 3.13.0 调用 Valgrind。)
Base
缺少虚拟析构函数,因此您调用 UB.
我正在使用 Valgrind 检查内存泄漏。
不幸的是,我收到 Leak_DefinitelyLost
警告。
附件是我的代码的简化版本,它重现了错误:
#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;
}
丢失发生在 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
我不确定我做错了什么。有人可以澄清错误发生在哪里吗?
(我从 CLion 2018.1.5、Valgrind 3.13.0 调用 Valgrind。)
Base
缺少虚拟析构函数,因此您调用 UB.