如何覆盖std :: function的new和delete而不全局覆盖它

时间:2018-02-05 13:21:30

标签: c++ memory-management embedded new-operator delete-operator

我正在为嵌入式环境编程。我不能使用标准的new和delete,因为它们不是确定性的,可能导致堆碎片和最终的设备运行时故障。

我正在使用std:function<>,直到我发现stdlib定义深处有这行代码被执行:

{ __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); }

现在我有两个不同的实现应用程序,两者都允许我使用的嵌入式标准。

1。)全局覆盖 new 从一块内存中分配并在删除时抛出错误。用于大多数以静态方式分配的对象。

2。)从固定大小的块池中分配的类特定的 new 。它永远不会导致碎片化,完全确定性并且具有O(1)有限的新的和删除时间。

如果我想使用std :: function,我需要覆盖std::function<> new ,而不是全局覆盖它。我已经有一个不同的全局新实现(1),它与预期的用法不兼容。事实上,我是如何解决这个问题的。

通常我会定义一个特定类的new并删除:

 class Context : public NetworkPacketContext {

      .......

      inline void* operator new(const size_t size) {
        return memory::allocateSmallBlock(size);
      }

      inline void operator delete(void* ptr) {
        return memory::freeSmallBlock(ptr);
      }

      .....
  };

但是这需要更改标准库的代码以插入特定于类的分配器及其模板实现,因此我不确定到底会有多少内存池。

有关如何执行此操作的任何建议。

0 个答案:

没有答案