C ++ 'da yeniden boyutlandırma, yapıcıları ve yıkıcıları çağırma olasılığından dolayı gariptir.
C ++ ' resize[]da gidecek bir operatörünüzün olmamasının temel bir nedeni olduğunu sanmıyorum new[]ve delete[]bu şuna benzer bir şey yaptı:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Açıkçası oldsizegizli bir yerden alınacaktı, aynı olduğu gibi delete[]veType işlenen türde gelirdi. resize[]Tür kopyalanamadığında başarısız olur - bu doğrudur, çünkü bu tür nesneler yeniden konumlandırılamaz. Son olarak, yukarıdaki kod, nesneleri atamadan önce varsayılan olarak inşa eder, ki bunu gerçek davranış olarak istemezsiniz.
newsize <= oldsizeYeniden küçültülmüş dizinin "sonunu geçen" nesneler için yıkıcıları çağırmak ve başka hiçbir şey yapmamak için olası bir optimizasyon var . Standart, bu optimizasyonun gerekli olup olmadığını tanımlamalıdır (resize() bir vektörde olduğu gibi), izin verilip verilmediğini, izin verilip verilmediğini, ancak uygulamaya bağlı mı yoksa yasak .
O zaman kendinize sormanız gereken soru, "bunu sağlamak gerçekten yararlı mıdır? vector da yapıyor ve özellikle yeniden boyutlandırılabilir bir kap (bitişik bellek - bu gereksinim C ++ 98'de ihmal edildi, ancak C ++ 03'te düzeltildi) bu, işleri yapmak için C ++ yöntemlerine sahip dizilerden daha uygun mu? "
Bence yanıtın yaygın olarak "hayır" olduğu düşünülüyor. Yeniden boyutlandırılabilir arabellekleri C yolu ile yapmak istiyorsanız malloc / free / realloc, C ++ 'da bulunanları kullanın . Yeniden boyutlandırılabilir arabellekleri C ++ yolu ile yapmak istiyorsanız, bir vektör kullanın (veya dequeaslında bitişik depolamaya ihtiyacınız yoksa). new[]Vektör benzeri bir kap uygulamadığınız sürece, bu ikisini ham tamponlar için kullanarak karıştırmaya çalışmayın .