对象创建的特殊方式?
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;
}
};
通过使用 malloc
和 new
运算符。
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
而不是捕获异常。
下面是实现 class 以创建对象的示例:
template <class T>
struct MallocCreator {
static T* Create() {
void* buf = std::malloc(sizeof(T));
if (!buf) return 0;
return new(buf) T;
}
};
通过使用 malloc
和 new
运算符。
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
而不是捕获异常。