Valgrind 在 std::make_unique 中显示内存泄漏

Posted

技术标签:

【中文标题】Valgrind 在 std::make_unique 中显示内存泄漏【英文标题】:Valgrind shows memory leak in std::make_unique 【发布时间】:2019-02-10 07:48:01 【问题描述】:

我正在使用 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> b1., 2., 3.;
            vector<double> c4., 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。)

【问题讨论】:

【参考方案1】:

Base 缺少虚拟析构函数,因此您调用 UB。

【讨论】:

以上是关于Valgrind 在 std::make_unique 中显示内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

valgrind 使用入门

如何在 python 中使用 valgrind?

freeglut 无法使用 valgrind 打开显示

内存泄漏分析valgrind

如何在 Valgrind 上设置分析的开始和结束

有没有办法在 Catalina 上安装 Valgrind?