Dizi yerleştirme-yeni tampon belirtilmemiş yükü gerektirir?
C 11 Şubat tasarının 5.3.4 [expr.new]
örnek verir:
new(2,f) T[5]
operator new[](sizeof(T)*5 y,2,f)
arama sonuçları.Burada, x ve y negatif olmayan değerler vardır belirlenemeyen bir dizi ayırma yükü; sonucunu gösterenyeni ifadedeğeri
operator new[]
tarafından döndürülen. bu miktar mahsup edilecektir Bu yükü tüm dizi uygulanabiliryeni ifadelerkütüphane işlevi başvuranoperator new[](std::size_t, void*)
ve diğer yerleşim ayırma fonksiyonları da dahil olmak üzere. Yük miktarını başka yeni birini çağırma değişebilir.—son örnek]
Şimdi aşağıdaki örnek kodu alın:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Yukarıdaki alıntıya göre, ikinci satır new (buffer) std::string[10]
içten operator new[](sizeof(std::string) * 10 y, buffer)
(std::string
nesneleri tek tek inşa önce) arar. Sorun varsa y > 0
önceden ayrılmış arabellek çok küçük olacaktır.
Ne kadar dizi kullanırken ön ayırmaya biliyor yerleştirme-yeni muyum?
void* buffer = malloc(sizeof(std::string) * 10 how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Ya da standart bir yere y == 0
Garanti Bu durumda? Yine alıntı diyor ki:
Bu yükü tüm dizi uygulanabiliryeni ifadelero
operator new[](std::size_t, void*)
kütüphane işlevi ve diğer yerleşim ayırma fonksiyonları başvuran dahil olmak üzere.
CEVAP
A-priori bu sorunun cevabını bilmiyorsanız operator new[](std::size_t, void* p)
kullanmayın. Cevap bir uygulama ayrıntıları ve derleyici/platform ile değiştirebilirsiniz. Genellikle herhangi bir platform için kararlı olmasına rağmen. E. g. bu bir şey Itanium ABI tarafından belirtildi.
Eğer bu sorunun cevabını bilmiyorsun bile, zamanında bu kontrol edebilirsiniz kendi yerleştirme dizi yeni yazma:
inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
if (n <= limit)
std::cout << "life is good\n";
else
throw std::bad_alloc();
return p;
}
int main()
{
alignas(std::string) char buffer[100];
std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}
Yukarıdaki örnekte dizi boyutu değişen ve n
inceleyerek, platformunuz için y
algılayın. my platform y
1 kelime için. Boyutu(word) 32 bit veya 64 bit mimarisi için hazırlıyorum bağlı olarak değişir.
Yığın üzerinde yeni bir dizi oluşturma...
JavaScript "Dizi(n)" yeni; ve...
JavaScript içinde var olan bir dizi ye...
Txt her satırı yeni bir dizi öğe için ...
&Quot vardır;yerleştirme yeni" kul...