在同一代码中放置新旧

时间:2015-01-22 03:15:31

标签: c++ new-operator raii placement-new

我正在编写一个需要在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方法。请评论这是否有效。

1 个答案:

答案 0 :(得分:3)

您可以只创建自定义堆管理器的“存根”实现,只需调用malloc()free()即可。然后,您可以在两个平台上使用带有展示位置new的统一界面。

或者,你可以为有问题的类定义你自己的operator new ...这只有在每个单独的类始终使用特定的堆管理器分配时才有效,而不是某些混合系统默认和自定义的。这不太灵活,但如果你可以忍受它,它可能比放置new更具可读性。