如何防止在 boost::fast_pool_allocator 管理的对象上调用析构函数?

2023-12-01

我想利用以下广告功能boost::fast_pool_allocator (see Boost Pool 的 Boost 文档):

例如,您可能会遇到这样的情况:您想要分配一个 一堆小物体在一个点上,然后到达你的一个点 不再需要它们的程序。使用池接口, 你可以选择运行它们的析构函数或者只是把他们扔进 遗忘...

(See here对于这个报价。)

关键短语是让他们被遗忘. I do not希望在这些对象上调用析构函数。

(原因是我有数百万个微小对象,它们在堆上形成了一个极其复杂的所有权网络,当单个最父对象离开堆栈时,我的程序需要大约 20 分钟才能调用所有析构函数。我不需要调用这些析构函数,因为没有期望的副作用,并且所有内存都包含在boost::pool.)

不幸的是,尽管上述文档做出了承诺,并且boost::pool概念,我找不到一种方法来阻止调用托管对象的析构函数。

该问题很容易在一个小示例程序中隔离:

class Obj
{
public:
    ~Obj()
    {
        // Placing a breakpoint here indicates that this is *always* reached
        // (except for the crash scenario discussed below)
        int m = 0;
    }
};

typedef std::map<int, Obj, std::less<int>,
                 boost::fast_pool_allocator<std::pair<int const, Obj>>>
        fast_int_to_int_map;

class Foo
{
public:
    ~Foo()
    {
        // When the following line is uncommented, the program CRASHES
        // when the destructor is exited - because the Obj destructors
        // are called on the invalid Obj ghost instances

        //boost::singleton_pool<boost::fast_pool_allocator_tag,
        //                  sizeof(std::pair<int const, Obj>)>::purge_memory();
    }

    fast_int_to_int_map mmap;
};

void mfoo()
{
    // When this function exits, the Foo instance goes off the stack
    // and its destructor is called, in turn calling the destructors
    // of the Obj instances - this is NOT desired!

    Foo foo;
    foo.mmap[0] = Obj();
    foo.mmap[1] = Obj();
}

int main()
{
    mfoo();

    // The following line deallocates the memory of the pool just fine -
    // but does nothing to prevent the destructors of the Obj instances
    // from being called

    boost::singleton_pool<boost::fast_pool_allocator_tag,
                          sizeof(std::pair<int const, Obj>)>::purge_memory();
}

正如代码注释中所述,析构函数Obj由管理的实例boost::pool总是被调用。

我该怎么做才能引用 Boost Pool 文档中的有希望的内容,drop them off into oblivion, 成真?


您将自定义分配器传递到您的std::map班级。所以,这个分配器将用于内部的所有内容std::map: 对全部Obj数据以及二叉树的节点std::map。结果,如果你打电话purge_memory() in Foo的析构函数,然后所有这些内存都变得无效,并且崩溃std::map析构函数。

您认为自定义分配器负责对象的解除分配的假设是不正确的:它是std::map的任务是释放所有对象。所以,~Obj()无论您传递自定义分配器还是使用默认分配器,都会被调用。

我没有看到你的问题有任何优雅的解决方案。但这种方法应该有效:

  • use placement new创造Foo来自池内存的对象,
  • 用这个Foo一如既往的对象,
  • call purge_memory()从池中释放所有内存。没有析构函数~Obj or ~std::map将被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止在 boost::fast_pool_allocator 管理的对象上调用析构函数? 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 如何在 Windows 版 Git 客户端中对 TFS 服务器进行身份验证?

    我们在公司域上设置了 TFS 2017 服务器 我想使用 Windows CMD 行的 Git 从该 TFS 服务器上的存储库推送和提取代码 我已将必要的证书添加到本地商店 以便通过 SSL 障碍 但现在当我尝试将远程存储库克隆到我的域加入
  • 圆形 UIButton

    我想知道是否可以绘制圆形 UIButton 不是圆角矩形 当我在自定义类型的 UIButton 中添加圆形图像时 它看起来像一个圆形按钮 但在单击按钮时 按钮的边界变得可见 因此它看起来像一个方形按钮 然后当单击结束时 它又看起来像一个圆形
  • Selenium 代理服务器参数 - 未知错误:net::ERR_TUNNEL_CONNECTION_FAILED

    希望你一切都好 我在尝试设置 chrome webdriver 时遇到了一些问题 我正在尝试更改网络驱动程序的参数以轮换用户代理和 IP 我将其用于抓取目的并且不想获得具有相同 IP 和 UA 的位置 当我通过 UA 参数时 一切正常 但是
  • 如何使div可拖动

    如何使元素可以在两个 div 之间拖动 这似乎是可拖动的应该做的事情 但我无法使用我拥有的代码 在这个 jsfiddle 中 我有两个带有可拖动元素的 div 我想让一个元素从第一个 div 转到第二个 div 许多网站上都必须存在该功能
  • jQuery DOM 对象的 x y 文档坐标

    我需要获取 DOM 元素的 X Y 坐标 相对于文档的顶部 左侧 我找不到任何可以为我提供这些的插件或 jQuery 属性或方法 我可以获得 DOM 元素的顶部和左侧 但这可以相对于其当前容器 父级或文档 你可以使用方面插件 已弃用 包含在
  • React Native {NativeModules} 未在 M1/Silicon mac 上导入 - 返回空对象 {}

    我试图在一个开发的项目中创建一个 React native 本机模块 BankedSdk M1MacBook 但是 任何初始化模块的尝试都会返回一个空对象 这是适用于我的示例 2020 存储库intel机器 https github com
  • Java 中的 PHP strtotime() ?

    我正在寻找一种简单的方法来从用户可能输入的任何类型的时间输入生成MySQL DATETIME PHP 的 strtotime 函数使这一切变得简单 它可以执行以下操作 strtotime 2004 02 12T15 19 21 00 00
  • Oracle:将字段标准化为 CSV 字符串

    我有一些一对多标准化数据 如下所示 a x a y a z b i b j b k 什么查询将返回数据 使得 多 端表示为 CSV 字符串 a x y z b i j k Mark 如果您使用的是版本 11gR2 而谁不是 那么您可以使用
  • 在VBA中重复随机变量

    如何使用 randomize 和 rnd 来获取随机变量的重复列表 通过重复列表 我的意思是 如果您运行循环来获取 10 个随机数 则列表中的每个随机数都将是唯一的 此外 如果再次运行该序列 您将获得与之前相同的 10 个随机数 来自微软自
  • Python 自定义比较器如何工作?

    我有以下 Python 字典 2 3 4 5 3 1 0 0 0 1 4 1 10 1 2 3 现在我想根据字典值的值之和对它们进行排序 因此对于第一个键 值之和为 3 4 5 12 我编写了以下代码来完成这项工作 def myCompar
  • Qt:制作不同颜色的堆叠条形图[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试在 Qt 中制作一个时间线 其中不同的颜色代表不同的任务 最终 它应该看起来有点像这样 但只有一行 现在有人知道如何在不安装额外库的情况下仅使用 QPaint 来做到这一点
  • Matplotlib:使用 twinx 叠加时箱线图和条形图会发生变化

    当我创建条形图并使用 twin x 覆盖条形图时 与条形相比 框看起来向右移动了一位 这个问题之前已经被识别过 Python pandas 绘制如果孪生两个 y 轴则移动 x 轴 但该解决方案似乎不再有效 我使用的是Matplotlib 3
  • ““void (exeCallback::*)(int)”类型的值不能分配给“void (*)(int)”类型的实体”[重复]

    这个问题在这里已经有答案了 可能的重复 禁用 错误的函数转换 警告 我试图让我的大脑围绕 C 函数指针 为了保持我的学习经验基础 我创建了一个测试函数指针示例 最终 我想通过引用传递所有就绪的实例化对象 以便我可以回调该对象的方法 然而 为
  • 使用 AWK/Grep/Bash 从 HTML 中提取数据

    我正在尝试编写一个 Bash 脚本来从 HTML 页面中提取结果 我用Curl实现了获取页面内容 但下一步是解析输出 这是有问题的 该页面有趣的内容如下所示 div class result div class item div class
  • 如何修复使用 zxing 2.1 生成的不清晰的二维码图像?

    我使用zxing 2 1库生成了二维码图像 但图像非常模糊且不清晰 我可能哪里出错了 生成发生在较低级别 然后根据宽度和高度请求进行缩放 您可以请求生成更高的宽度和高度 ZXing 在查看器中公开了您可以设置的 BarcodeOptions
  • MySQL 按两个值排序

    简而言之 我有一个游戏 它的计分板显示了玩家最后的分数 他们花了多长时间才达到这个分数 我需要对 MySQL 结果进行排序 以便最快时间的最高分数排在第一位 最慢时间的最低分数排在最后 并且两者之间的所有内容都以相同的方式排名 但我不知道该
  • collectingAndThen方法足够高效吗?

    我最近开始使用collectingAndThen 发现与我用来执行类似任务的其他编码程序相比 它花费的时间有点长 这是我的代码 System out println CollectingAndThen Long t System curre
  • 分割逗号分隔的字符串,但忽略逗号后跟空格

    公共静态无效主 字符串 args String title Today and tomorrow 2 1 2 5 0 String titleSep title split System out println Arrays toStrin
  • 用户控件的数据上下文

    我正在创建一个UserControl我想用这样的东西
  • 如何防止在 boost::fast_pool_allocator 管理的对象上调用析构函数?

    我想利用以下广告功能boost fast pool allocator see Boost Pool 的 Boost 文档 例如 您可能会遇到这样的情况 您想要分配一个 一堆小物体在一个点上 然后到达你的一个点 不再需要它们的程序 使用池接