在c++中new有三种用法:实例化一个对象;实例化一个数组;定位new表达式。那么今天我来说下第三种用法。
【什么是定位new表达式】:
就是在内存中new一块地址,然后将大小合适的实例化对象放入该地址中的操作方法
【什么性质:】
就是在已申请的内存空间中调用构造函数
【怎么使用定位new表达式】:
1)格式:new (place_address) type(initializer-list) :place_address必须是一个指针,initializer-list是类型的初始化列表。
2)我来举个例子说明下如何使用:
#include<iostream>
using namespace std;
class Array
{
public :
Array (size_t size = 10)
:_size(size)
, _a(0)
{
cout<<"Array(size_t size)" <<endl;
if (_size > 0)
{
_a = new int[ size];
}
}
~Array()
{
cout<<"~Array()" <<endl;
if (_a )
{
delete[] _a ;
_a = 0;
_size = 0;
}
}
private :
int* _a ;
size_t _size ;
};
void Test ()
{
//malloc/free + 定位操作符new()/显示调用析构函数,模拟 new和delete的行为
Array* p1 = (Array*) malloc(sizeof(Array));
new(p1)Array(100);
p1->~Array();
free(p1);
//malloc/free+多次调用定位操作符new()/显示调用析构函数,模拟
//new[]和delete[] 的行为
Array* p2 = (Array*) malloc(sizeof(Array)*10);
for(int i = 0; i < 10; ++i )
{
new(p2 +i) Array;
}
for(int i = 0; i < 10; ++i )
{
p2[i ].~Array();
}
free(p2 );
}
int main()
{
Test();
return 0;
}