SORU
4 Ocak 2012, ÇARŞAMBA


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şvuran operator 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
4 Ocak 2012, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Brandon McCrary

    Brandon McCr

    15 Ocak 2012
  • L- Crysis

    L- Crysis

    30 Aralık 2011
  • Skrillex

    Skrillex

    6 NİSAN 2010