对象创建的特殊方式?

Peculiar way for object creation?

下面是实现 class 以创建对象的示例:

template <class T>
struct MallocCreator {
    static T* Create() {
        void* buf = std::malloc(sizeof(T));
        if (!buf) return 0;
        return new(buf) T;
    }
};

通过使用 mallocnew 运算符。

new的作用是什么,上面的语法到底是什么?

这是在那里新使用的展示位置:http://en.cppreference.com/w/cpp/language/new

首先,这段代码是通过malloc分配内存,然后在分配的内存中构造对象。

"placement new"。您的代码所做的是使用 malloc 创建一个 T 大小的原始内存,然后在该原始内存中构造一个新的 T

new(buf) MyObject 是 placement-new-operator。

它基本上是说,buf 是我为对象分配的一些内存,我希望 C++ 在该内存中创建对象。 (常规的new既会分配内存又会构造对象。)

看起来写这段代码的人试图 return NULL 以防出现分配问题,其中 "conventional" new 抛出异常 (std::badalloc) 如果分配过程中出现问题。

根据我的经验,开发人员通常不习惯异常处理,宁愿检查 NULL 而不是捕获异常。