我正在编写一个需要在Windows和Linux上运行的应用程序。在Linux上,我们使用一些自定义库进行堆管理,它使用placement new
。
但是,我们在Windows上没有该库。我们如何在两个平台上实现new
逻辑统一,而无需在任何地方添加#ifdef WINDOWS
。
我在考虑这样的事情:
创建一个包装类
MyClass {
template<T> memberVar;
}
此实现将针对Windows与Linux进行更改。
Windows: memberVar = new memberVar
Linux: memberVar = new(100) memberVar
在代码中我们将按如下方式使用它...假设我们要创建类型为obj1
的对象...而不是像obj1 objVar = new obj1()
这样的对象
我们会这样做:MyClass(obj1);
我在这里间接使用RAII方法。请评论这是否有效。
答案 0 :(得分:3)
您可以只创建自定义堆管理器的“存根”实现,只需调用malloc()
和free()
即可。然后,您可以在两个平台上使用带有展示位置new
的统一界面。
或者,你可以为有问题的类定义你自己的operator new
...这只有在每个单独的类始终使用特定的堆管理器分配时才有效,而不是某些混合系统默认和自定义的。这不太灵活,但如果你可以忍受它,它可能比放置new
更具可读性。