在对类进行实例化时也许会批量申请
例如,申请10个Account实例,
Account *buf=new Account[10];//申请内存,并调用默认构造函数
for(int i=0;i<10;i++)
new(buf+i) Account("ab",i);调用用具有两个参数的构造函数,在原来的内存上
上面的两次调用构造函数,只能有一个进行_name的内存的动态分配,否则两次的 动态分配只调用一次析构函数,造成内存泄漏
在释放内存时可以直接
delete[] buf//注意调用析构函数的顺序是反的
因为buf就是Account数组,就会以此进行调用析构函数
也可以分别进行调用析构函数
for(int i=0;i<10;i++)
buf[i].~Account();
不过我认为还是调用delete[] buf更能够和上面的new对应,两者只能使用一个,
但是有一个疑问就是buf只是申请实例本身的内存,而构造函数是在申请char*_name的内存,析构函数是删除_name的内存,当再次进行delete时是删除实例本身的内存,但是实际上却不是这样。
char *buf=new char [sizeof(Account)*10];//预分配一定的内存
int offset=sizeof(Account);//根据偏移量进行初始化
for(int i=0;i<10;i++)
{
new(buf+i*offset) Account("ab",i);
}
//Account *p=reinterpret_cast<Account*>(buf);
Account *ps=(Account*)buf;
for(int i=0;i<elems;i++)
ps[i].~Account();//依次调用析构函数
// delete[] reinterpret_cast<char*>(ps);
delete [] buf;删除内存
这个例子和上面的疑问相对应,只有在预分配的情况下才可以说的通