1. 程式人生 > >類的動態分配記憶體與釋放

類的動態分配記憶體與釋放

在對類進行例項化時也許會批量申請

例如,申請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;刪除記憶體
這個例子和上面的疑問相對應,只有在預分配的情況下才可以說的通