c++ - 创建 myNew/myDelete 替换 new/new[]/delete/delete[]

标签 c++ memory-management maintainability

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

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

示例

例如,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 ,然后我可以重构它。
不过,以后可能会是一件很伤脑筋的工作。

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

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

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

最佳答案

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 需要使用另一个分配器,那么只需将辅助类切换为另一个分配器即可。

关于c++ - 创建 myNew/myDelete 替换 new/new[]/delete/delete[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43992580/

相关文章:

c++ - 已加载本地生成的小型转储,但远程生成的小型转储无法加载调用堆栈和符号

c++ - 如何在Visual Studio中添加 "Include directories"中的所有子目录?

c++ - 是否有适用于 iOS 的高级音频队列记录服务库?

memory-management - Release Release UIWebView content from the memory,强制app释放内存

c - 如何让 mmap 内存同步到文件?

c# - C#中的枚举类型

php - 构建可伸缩(可扩展)、可维护和松耦合软件的最佳技术是什么?

c++ - C++中是否存在任何隐式内存障碍

java - Quartz 调度程序维护和性能开销

python - 有条件进口的良好做法