new的二三事

stackoverflow真是个绝佳的平台。基本上所有的问题都可以找到答案。今天遇到两个比较新鲜的关于new的问题,一个是operator new,另一个是placement new。

operator new

问个问题先:“new operator”和“operator new”有什么区别?new operator大家都很熟悉,就是平常用来创建对象的那个操作符咯。
[ccb_c++]
my_class *x = new my_class(0);
[/ccb_c++]
operator new是什么?好像从来没听过。operator new是用来分配内存的,仅此而已。在概念上来说,operator new和malloc类似。虽然operator new并不常用,但是如果要自己写容器之类的,那么operator new就有用武之地了。operator new可以这样用:
[ccb_c++]
char *x = static_cast(operator new(100));
[/ccb_c++]
operator new和new operator之间的区别在于,new operator会先用operator new去分配内存,然后调用类的构造函数去初始化对象。

placement new

上面说了,new的时候会先分配内存,然后调用构造函数。但是placement new允许在已经分配的内存上面直接构造对象。

这个东西是很有市场的。不用再次分配内存会节省很多时间,提高程序的效率。另外有时候我们不希望发生分配内存出错的情况,placement new就派上用场了,因为内存已经分配好了。placement new要这样用:
[ccb_c++]
char *buf = new char[sizeof(string)]; //pre-allocated buffer
string *p = new (buf) string(“hi”); //placement new
string *q = new string(“hi”); //ordinary heap allocation
[/ccb_c++]

参考

Difference between ‘new operator’ and ‘operator new’?
What uses are there for “placement new”?

发表评论

电子邮件地址不会被公开。 必填项已用*标注