类的动态分配内存与释放

来源:互联网 发布:python proxyfix 编辑:程序博客网 时间:2024/05/19 04:51

在对类进行实例化时也许会批量申请

例如,申请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;删除内存
这个例子和上面的疑问相对应,只有在预分配的情况下才可以说的通