【问题标题】:Create myNew/myDelete to replace new/new[]/delete/delete[]创建 myNew/myDelete 以替换 new/new[]/delete/delete[]
【发布时间】:2017-05-16 04:35:47
【问题描述】:

如何将我的程序编码为可以灵活地提前接收自定义分配器?

我编写了一些分配器,但不确定我是否真的需要它。
但是,我确信如果我的自定义分配器将被插入,我想在某些部分使用它。

示例

例如,int* B::db 应使用自定义分配器 (myNew/myDelete),
而所有std::vector 都应该使用标准分配器

虽然我仍然没有插入我的自定义分配器,但我希望我的程序将使用标准 new/delete 作为默认值。

#define myNew new
#define myDelete delete
class B{ //B should not be a template class
    int* db=nullptr;
    std::vector<float> something; //<- let it use default new/delete
    public: B(){
        db=myNew int[5];   //work like "db=new int[5];"
    }
    public: ~B(){
        myDelete[] db;     //work like "delete[] db;"
    }
};

如果我想稍后插入自定义分配器,我可以更改 #define

注意:B 不应是模板类。

问题

我不确定这是否是正确的方法。我对分配器还是很陌生。
如果可能的话,我也想避免使用宏。
这是一个很好的解决方案吗?有没有没有宏的解决方案?

我可以让我的程序只使用new/delete 作为默认值,我可以稍后对其进行重构。
不过,以后可能会是个脑洞大开的作品。

注意:大多数 Q/A 似乎都集中在重载全局 new/delete。那不是我想要的。 :-

对不起,如果这个问题太新手了。
我还没有找到任何关于在 real 实践中使用分配器的好的教程/信息。

我也读过(它们只是分配器+代码的理论):-

【问题讨论】:

  • 实际上不明白你在问什么
  • @Passer 很抱歉听到这个消息。简而言之,问题是“如何制作一个程序来轻松打开和关闭自定义分配器?”

标签: c++ memory-management maintainability


【解决方案1】:

B 可能必须保持非模板。但这并不意味着您不能编写模板来提供帮助。您还可以在使用 RAII 时为其提供便利。

template<typename T>
class my_new_heap_array {
  T *ptr;
public:
  operator T*() const { return ptr; }

  my_new_heap_array(std::size_t sz) 
    : ptr(myNew T[sz])
  {}

  ~my_new_heap_array() { myDelete[] ptr; }
};

class B { //B should not be a template class
    my_new_heap_array<int> db;
    std::vector<float> something; //<- let it use default new/delete
    public:
    B()
      :db(5)
    { }
};

一般来说,只要您在编程时考虑到关注点分离,您就会发现更容易更轻松地更改行为。 B 需要决定使用什么分配器,但它不应该关心如何使用它。这种担忧落在了助手类身上。如果某天 B 需要使用另一个分配器,那么只需将辅助类切换为另一个。

【讨论】:

  • 这似乎是一个正确的方法,谢谢。我从未见过任何一本书这样做。我在哪里可以找到更多信息/这种技术叫什么?
  • @javaLover - 嗯,我已经把它当作 C++ 民间传说这么久了,我忘记了我第一次看到它的地方。我认为“关注点分离”的一般设计原则是需要注意的。如果您发现自己在考虑如何在一个类中自定义某些东西,这通常表明您的类不是应该关注它是如何完成的,而是另一个组合到您的业务逻辑中的实用程序类。 [/ramble]。
  • 您的演讲一如既往的充满智慧。它让我以更加模块化的方式看待所有编程。在我阅读您的评论之后,还有很多其他的事情要考虑。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2019-05-31
  • 2020-09-29
相关资源
最近更新 更多