2012-05-04 11 views
6

Yeni operatör, sürekli yığın yığın belleği ayırmayı garanti ediyor mu? YaniC++ yeni işleç - bellek düzeni

objects=(Base*)malloc(1024*sizeof(base)); 

veya boşluklar olabilir aynı bellek ayırma açısından

objects=new Base[1024]; 

mı?

cevap

8

Evet, bellek sürekli olacak. Tahsisi açısından, malloc sürümü ile aynıdır, ancak birkaç fark vardır (kurucuya yapılan çağrılar, NULL, malloc, istisnalar, vs. atmaz). Eğer delete veya free ile new[] karıştırmak olamaz

Not Belleği boşaltmak için delete[] objects kullanmak zorunda.

+0

Tam olarak aynı değil. 'New []' sürümü, her bir nesnede varsayılan yapıcıyı çağırır. –

+1

@ edA-qamort-ora-y dediğim şey buydu ... –

+0

Üzgünüm, bugün körüm. Ancak yeni versiyon dizinin büyüklüğünü hatırlamak için biraz daha fazla alan tahsis edecek, bu yüzden sil [] [] doğru sayıda destrüktörü arayabilir. Elbette uzayda küçük bir fark var. –

3

Belki de. new operatörü iki şey yapar: operator new işlevini çağırır; bu, tüm olası türler için uygun şekilde hizalanmış bitişik bir bellek bloğu döndürecektir (örneğin, yeni bir yanlış yerleştirilmiş yerleşim olmadığı zamanlar hariç); Daha sonra, hemen her şey hakkında yapabilecek olan nesnenin yapıcısını çağırır. İlk ile bitişik olmayacak ek bloklar tahsis dahil.

0

new işleci aşırı yüklenmediyse, evet ayrılmış bellek bloğu bitişiktir. Ama aşırı yüklenirse, bunu bilemeyiz (bazı kötü programcılar aşırı yüklenebilir?: D)