相关疑难解决方法(0)

如何控制第三方库代码中的内存分配策略?

上一个标题:"我必须替换全局运算符new和delete以更改第三方代码中的内存分配策略吗?"

简短的故事: 我们需要在不改变源代码的情况下替换第三方库中的内存分配技术.

很长的故事:

考虑使用大量动态分配的内存绑定应用程序(可能是几乎所有可用的系统内存).我们使用专门的分配器,并在任何地方使用它们(shared_ptr容器等).我们对应用程序中分配的每个字节内存都有完全的控制和功能.

此外,我们需要链接第三方帮助程序库.那个讨厌的家伙使得分配在一些标准的方法,使用默认的运营商new,new[],deletedelete[]malloc或别的东西非标准(让我们一概而论说我们不知道这个库如何管理它的堆分配).

如果这个帮助程序库进行足够大的分配,我们可能会出现硬盘抖动,内存碎片和对齐问题,内存bad_alloc不足以及各种问题.

我们不能(或不想)更改库源代码.

第一次尝试:

我们之前从未在发布版本中遇到过这种不圣洁的"hack".使用覆盖运算符的第一次测试new工作正常,但以下情况除外:

  • 我们不知道未来会有什么等待我们(这太糟糕了)
  • 我们的用户(甚至我们的分配器)现在必须按照我们的方式进行分配

问题:

  1. 有没有办法挂钩这些分配而不会重载全局运营商?(本地lib-hook挂钩?)
  2. ......如果我们不知道它究竟用于什么:malloc或者new
  3. 此签名列表是否完整?(并且没有其他事情我们必须实施):

    void* operator new (std::size_t size) throw (std::bad_alloc);
    void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
    void* operator new (std::size_t size, void* ptr) throw();
    void* operator new[] (std::size_t size) throw (std::bad_alloc);
    void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) throw(); …
    Run Code Online (Sandbox Code Playgroud)

c++ new-operator delete-operator

37
推荐指数
1
解决办法
2087
查看次数

标签 统计

c++ ×1

delete-operator ×1

new-operator ×1