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

2024-05-24

我正在使用 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 call:

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 https://en.wikipedia.org/wiki/Undefined_behavior#Examples_in_C_and_C++.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Valgrind 在 std::make_unique 中显示内存泄漏 的相关文章

随机推荐

  • 使用包含 [模板]、[编码]、[所有者] 的批处理文件和 .sql 文件创建 Postgres 数据库

    我想使用批处理文件创建 Postgres 数据库 现在执行此操作的正常方法如下 C Program Files PostgreSQL 9 0 bin createdb exe U Myadmin MydatAbseName 上面的脚本使用默
  • 平移/缩放顺序尺度?

    我正在使用 d3 渲染简化的甘特图 并使用 d3 behavior zoom 进行平移和缩放 x 刻度是一个时间刻度 稍微修改为列中的中心日历日等 并且工作得很好 但是我在决定如何缩放 平移 y 刻度时遇到问题 其域是通常会出现的任务列表图
  • 如何在Android中的多个Activity之间切换

    我有 8 个屏幕 我为此准备了 8 个活动 在第一个活动中我给出了这段代码 从 Is 活动切换到 IInd 在图像按钮上给出单击 public void onClick View v Intent myIntent new Intent v
  • 如何进入system.web.mvc

    有谁知道我如何进入system web mvc 我收到隐藏在 System Web Mvc DefaultModelBinder CreateModel 方法中的错误 无法创建抽象类 并且我无法判断代码的哪一部分导致了问题 有人建议我可以从
  • 聚合多重性 UML

    我和我的同事在某一点上无法达成一致 在 UML 中 当进行聚合时 菱形边重数最大为 1 或者可以是 0 吗 还是取决于某种观点 先感谢您 首先 您需要具体说明您指的是哪个 钻石 作为空钻石聚合填充钻石是作品 如果你的意思是空钻石 那么 Ic
  • 如何使 Django ManyToMany “直通”查询更加高效?

    我使用的是 ManyToManyField 和 through 类 这会在获取事物列表时产生大量查询 我想知道是否有更有效的方法 例如 这里有一些描述书籍及其几位作者的简化类 它们通过角色类 定义 编辑器 插画家 等角色 class Per
  • 如何添加表单加载事件(目前不起作用)

    我有一个 Windows 窗体表单 我试图在表单加载时显示用户控件 不幸的是 它没有显示任何内容 我究竟做错了什么 请看下面的代码 AdministrationView wel new AdministrationView public P
  • 从 asp.net mvc ajax 调用 wcf

    我有两个应用程序 第一个是 WCF 服务 第二个是 asp net MVC 3 应用程序 在 WCF 应用程序中我有一个界面 ServiceContract public interface IService1 OperationContr
  • Codeigniter子域路由

    我正在尝试在 CodeIgniter 框架上运行的网站上设置博客脚本 我想在不对现有网站代码进行任何重大代码更改的情况下执行此操作 我认为创建一个指向另一个控制器的子域将是执行此操作的最干净的方法 我设置新设备所采取的步骤Blog涉及控制器
  • sphinx导入父目录第一个文件?

    我需要为每个模块创建一个 sphinx 项目 每个模块共享一些公共资源 例如公司信息 许可证等 我的项目树是这样的 conf py index rst intro rst about rst device1 conf py device1
  • 在 MediaFoundation 硬件 MFT 中设置更大的 GOP 大小

    我正在尝试直播通过桌面复制 API 捕获的桌面 H264 编码工作正常 除了桌面复制 API 仅在屏幕发生变化时才传送帧 但视频编码器希望以恒定的帧速率传送帧 因此 当没有触发屏幕更改时 我被迫保存之前的样本 以恒定的速率向编码器提供数据
  • AEM DefaultValue 写入 JCR

    我注意到 当我为下拉列表设置 defaultValue 时 尽管当我第一次将组件添加到页面时在下拉列表中正确选择了它 但它不会将 defaultValue 写入相应的 JCR 直到我编辑组件并保存它 即使我只是打开相应的对话框并单击 确定
  • 获取 NSLayoutConstraints 关联视图

    我试图循环遍历视图约束 我向 view1 添加了 顶部 尾部 前导和高度约束 top trailing 和leading 是主ViewControllers 视图 如果我循环查看 view1 的约束 我只会看到高度约束 for constr
  • 使用react-native测量音频的响度

    我正在创建一个应用程序 Android 来使用本机反应录制手机中的语音 一项要求是实时测量声音的响度并基于它制作动画 我尝试使用react native audio库 但问题是响度监控仅在IOS中支持 我检查了世博会音频库 但找不到方法 有
  • 具体实现是否应该提供其实现的接口中不存在的任何公共 API?

    接口代码 被认为是很好的实践 这样的代码很容易进行单元测试并实现松散耦合 用户只知道接口 并且连接具体对象的责任位于最顶层 这可以在某些初始化代码中或在帮助下完成 框架 我的问题是关于遵循以下做法代码到接口 这是否意味着具体类永远不能声明其
  • 在 WebViewClient 中重写 shouldInterceptRequest 时系统崩溃

    Goal 覆盖 WebView 发出的所有请求并自己发出请求 最终设置代理 Code Override public WebResourceResponse shouldInterceptRequest WebView view Strin
  • django 尝试了这些 url 模式

    当我尝试访问我的站点时 它会给出以下信息 使用 mysite urls 中定义的 URLconf Django 按以下顺序尝试了这些 URL 模式 管理员 当前 URL 与其中任何一个都不匹配 如果我访问该网站并附加 admin 它会将我带
  • 如何在chart.js中使用JSON数据?

    您好 我一直在尝试使用 MYSQL 数据库中的数据 并使用它们通过 Chart js 创建图形图表 我将数据编码为 JSON 数据 通过 php 文件名 data1 php 现在我需要使用 Jquery 或 javascript 将这些 J
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • Valgrind 在 std::make_unique 中显示内存泄漏

    我正在使用 Valgrind 来检查内存泄漏 不幸的是我得到了Leak DefinitelyLost警告 附件是我的代码的简化版本 它重现了该错误 include