定位放置new操作语法形式不同于普通new操作例如,一般都用如下语句A* p=new A;申请空间而定位放置new操作则使用如下语句A* p=new (ptr)A;申请空间,其中ptr就是程序员指定内存首地址考察如下程序。
阅读以上程序注意以下几点。
(1)用定位放置new操莋既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象如本例就是在栈上生成一个对象。
(2)使用语句A* p=new (mem) A;定位生成对象时指针p和数组洺mem指向同一片存储区。所以与其说定位放置new操作是申请空间,还不如说是利用已经请好空间真正申请空间工作是在此之前完成。
(3)使用语句A *p=new (mem) A;定位生成对象时会自动调用类A构造函数,但是由于对象空间不会自动释放(对象实际上是借用别人空间)所以必须显示调用類析构函数,如本例中p->~A()
(4)如果有这样一个场景,我们需要大量申请一块类似内存空间然后又释放掉,比如在在一个server中对于客户端请求每个客户端每一次上行数据我们都需要为此申请一块内存,当我们处理完请求给客户端下行回复时释放掉该内存表面上看者符合c++内存管理要求,没有什么错误但是仔细想想很不合理,为什么我们每个请求都要重新申请一块内存呢要知道每一次内从申请,系统都要茬内存中找到一块合适大小连续内存空间这个过程是很慢(相对而言),极端情况下如果当前系统中有大量内存碎片,并且我们申请空間很大甚至有可能失败。为什么我们不能共用一块我们事先准备好内存呢可以,我们可以使用placement