定位new运算符,它让你能够指定要使用的位置,可能使用这种特性来设置其内存管理规程,处理需要通过特定地址进行访问的硬件或在特定位置创建对象。
1,头文件<new>
2,将new运算符用于提供了所需地址的参数。
例如:
程序中的buffer是char指针,如果要访问buffer1, buffer2 的地址,需使用(void *)进行强制类型转换。
与常规new运算符不同的是:
1,常规new运算符查找一个新的内存块;但定位new运算符使用传递给它的地址,它不跟踪哪些内存单元已被使用,也不查找未经使用的内存块。
2,对于常规new运算符必须要delete掉,才能再次使用该内存块;buffer指定的是静态内存,而delete只能用于指向常规new运算符分配的堆内存。也就是说,数组buffer位于delete的管辖区域之外。
定位new运算符的工作原理:基本上它只是返回传递给它的地址,并将其强制类型转换为(void *),以便能够赋给任何指针类型。C++允许重载定位new运算符。
再谈new和delete
如果对象是动态变量,当执行完定义该对象的程序块时,将调用该对象的析构函数。
如果对象是静态变量(外部,静态,静态外部或来自名称空间),则在程序结束时将调用对象的析构函数。
如果对象是用new创建的,只有当显示的使用delete删除对象时,才会调用析构函数。
所以显示地为使用定位new运算符创建的对象调用析构函数。
例如:
对于使用定位new运算符创建的对象,应以与创建顺序相反的顺序进行删除。原因在于,晚创建的对象可能依赖早创建的对象。另外仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。
p2->~just();
p1->~just();
delete [] buffer;