類的動態分配記憶體與釋放
阿新 • • 發佈:2019-01-09
在對類進行例項化時也許會批量申請
例如,申請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陣列,就會以此進行呼叫解構函式
也可以分別進行呼叫解構函式
不過我認為還是呼叫delete[] buf更能夠和上面的new對應,兩者只能使用一個,for(int i=0;i<10;i++) buf[i].~Account();
但是有一個疑問就是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;刪除記憶體