浅谈C++的new(new expression和operator new)
在看《STL源码剖析》第2章时,在stl_stl_construct.h中使用new的代码如下:
1 2 3 4 5 |
template <class T1, class T2> inline void construct(T1* p, const T2& value) { new (p) T1(value); } |
在defalloc.h中使用new的代码如下:
1 2 3 4 5 6 7 8 9 10 11 |
template <class T> inline T* allocate(ptrdiff_t size, T*) { set_new_handler(0); T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); if (tmp == 0) { cerr << "out of memory" << endl; exit(1); } return tmp; } |
之前没有这么使用过C++中的new,于是查了一下,原来new不只是运算符(operator),还是表达式(expression)!下面的链接有详细的说明了例子,参考链接:
new expression
operator new
总结以下几点:
- 调用new的语法区分出是expression还是operator
- 将分配内存空间和执行初始化函数分为两步,new operator分配内存,new expression尝试执行初始化
- new operator可以自定义重载,可以自定义new operator,new expression不能自定义
- 在未指定::operator时,new是expression,new expression会调用new operator